我的数据库中有一个特定的行,其中包含以下信息:
data:
user_id start_time end_time
405 12:00:00 14:00:00
我有以下SELECT语句:
SELECT *
FROM data
INNER join users on users.user_id = data.user_id
WHERE NOT EXISTS
(SELECT * FROM data
WHERE '10:00:00' BETWEEN start_time AND end_time)
GROUP BY users.usrID");
现在,我认为此查询将返回上面的行(用户405),但是,它不会返回任何人。 (因为10:00:00不在12:00:00和14:00:00之间)。
有趣的是,如果我将值10:00:00更改为07:00:00,它可以正常工作。
关于为什么这不起作用的任何想法?在数据库中,我将字段设置为TIME,并将它们格式化为:00:00:00
非常感谢!
更新
我改变了我的查询,看起来像这样:
SELECT usrID,
first,
last
FROM users
WHERE user_id NOT IN (SELECT u.user_id
FROM `data` d,
`users` u
WHERE d.user_id = u.user_id
AND CAST('10:00:00' AS TIME) BETWEEN start_time AND end_time)
ORDER BY u.user_id
这似乎可以解决问题。感谢您的帮助。
答案 0 :(得分:3)
根据between
的MySQL手册页:
“为了在将BETWEEN与日期或时间值一起使用时获得最佳结果,您应该使用CAST()将值显式转换为所需的数据类型。示例:如果将DATETIME与两个DATE值进行比较,请将DATE值转换为DATETIME值。如果在与DATE的比较中使用字符串常量(如“2001-1-1”),则将字符串强制转换为DATE。“
尝试:
SELECT *
FROM data
INNER join users on users.user_id = data.user_id
WHERE NOT EXISTS
(
SELECT *
FROM data
WHERE CAST('10:00:00' AS TIME) BETWEEN start_time AND end_time
)
GROUP BY users.usrID
如果没有明确的类型转换,MySQL可能会将时间值转换为字符串文字以进行比较,而不是将字符串文字转换为时间值。
答案 1 :(得分:2)
我认为正在发生的事情是'10:00:00'时间被视为一个字符串,而不是时间。这可以解释为什么'07:00:00'给出不同的结果。尝试将值转换为时间...我认为语法类似于:
cast('10:00:00' as time)
答案 2 :(得分:1)
尝试:
SELECT *
FROM DATA d
JOIN USERS u ON u.user_id = d.user_id
WHERE NOT EXISTS (SELECT NULL
FROM DATA t
WHERE t.id = d.id
AND CONVERT('10:00:00', TIME) BETWEEN t.start_time AND t.end_time)
GROUP BY u.usrID
当您正确评估BETWEEN时,您会注意到您没有关联子查询 - 只是因为它们是同一个表,并不意味着这两个查询是链接的。