我已将用户注册的日期保存为日期时间,例如 2011-12-06 10:45:36 。我已经运行了这个查询,我预计这个项目 - 2011-12-06 10:45:36 - 将被选中:
SELECT `users`.* FROM `users` WHERE created_at >= '2011-12-01' AND
created_at <= '2011-12-06'
但事实并非如此。存在任何优雅的方式,如何选择这个项目?我得到的第一个想法就像2011-12-06 + 1
,但这看起来不太好。
答案 0 :(得分:31)
您的问题是日期的短版本使用午夜作为默认值。所以你的查询实际上是:
SELECT users.* FROM users
WHERE created_at >= '2011-12-01 00:00:00'
AND created_at <= '2011-12-06 00:00:00'
这就是为什么你没有看到10:45的记录。
将其更改为:
SELECT users.* FROM users
WHERE created_at >= '2011-12-01'
AND created_at <= '2011-12-07'
您也可以使用:
SELECT users.* from users
WHERE created_at >= '2011-12-01'
AND created_at <= date_add('2011-12-01', INTERVAL 7 DAY)
将选择您要查找的同一时间段内的所有用户。
您可能还会发现BETWEEN运算符更具可读性:
SELECT users.* from users
WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY));
答案 1 :(得分:4)
您需要使用“2011-12-07”作为结束点作为日期,默认时间为00:00:00。
所以你实际写的内容被解释为:
SELECT users.*
FROM users
WHERE created_at >= '2011-12-01 00:00:00'
AND created_at <= '2011-12-06 00:00:00'
你的时间戳是:2011-12-06 10:45:36这不在这些点之间 改变这个:
SELECT users.*
FROM users
WHERE created_at >= '2011-12-01' -- Implied 00:00:00
AND created_at < '2011-12-07' -- Implied 00:00:00 and smaller than
-- thus any time on 06
答案 2 :(得分:4)
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';
答案 3 :(得分:2)
另一种选择是在左侧操作数上使用select t.*
from (select t.*,
(@rn := if(@c = category_id, @rn + 1,
if(@c := category_id, 1, 1)
)
) as rn
from t cross join
(select @rn := 0, @c := -1) params
order by category_id, created desc
) t
having rn <= 2;
函数,如下所示
DATE()
答案 4 :(得分:1)
你有没有尝试过前后而不是&gt; =和&lt; =?此外,这是日期还是时间戳?
答案 5 :(得分:1)
搜索created_at <= '2011-12-06'
将搜索2011-12-06午夜或之前创建的任何记录
。您想要搜索created_at < '2011-12-07'
。
答案 6 :(得分:0)
也许在两者之间使用更好。它对我有用,可以获得范围然后过滤它
答案 7 :(得分:0)
您可以使用MySQL DATE
功能,如下所示
例如,如果您想在2017-09-05至2017-09-09期间获得结果
SELECT DATE(timestamp_field) as date FROM stocks_annc WHERE DATE(timestamp_field) >= '2017-09-05' AND DATE(timestamp_field) <= '2017-09-09'
确保将日期包装在单引号''
希望这有帮助。