MySQL - 在两个日期之间从数据库中选择数据

时间:2011-12-10 17:11:03

标签: mysql date datetime

我已将用户注册的日期保存为日期时间,例如 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,但这看起来不太好。

8 个答案:

答案 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'

确保将日期包装在单引号''

希望这有帮助。