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

use*_*621 13 mysql datetime date

我已将用户注册的日期保存为日期时间,因此例如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'
Run Code Online (Sandbox Code Playgroud)

但事实并非如此.存在任何优雅的方式,如何选择这个项目?作为我的第一个想法是2011-12-06 + 1,但这看起来不是很好.

das*_*ash 36

您的问题是日期的短版本使用午夜作为默认值.所以你的查询实际上是:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01 00:00:00' 
AND created_at <= '2011-12-06 00:00:00'
Run Code Online (Sandbox Code Playgroud)

这就是为什么你没有看到10:45的记录.

将其更改为:

SELECT users.* FROM users 
WHERE created_at >= '2011-12-01' 
AND created_at <= '2011-12-07'
Run Code Online (Sandbox Code Playgroud)

您还可以使用:

SELECT users.* from users 
WHERE created_at >= '2011-12-01' 
AND created_at <= date_add('2011-12-01', INTERVAL 7 DAY)
Run Code Online (Sandbox Code Playgroud)

这将选择您要查找的同一时间间隔内的所有用户.

您可能还会发现BETWEEN运算符更具可读性:

SELECT users.* from users 
WHERE created_at BETWEEN('2011-12-01', date_add('2011-12-01', INTERVAL 7 DAY));
Run Code Online (Sandbox Code Playgroud)

  • 如果其他人对最后一个示例有疑问,请尝试以下语法:`SELECT users.* from users WHERE created_at BETWEEN '2011-12-01' AND date_add('2011-12-01', INTERVAL 7 DAY);` (2认同)

Mar*_*oda 6

SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';
Run Code Online (Sandbox Code Playgroud)


Mar*_*ork 5

您需要使用“ 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'
Run Code Online (Sandbox Code Playgroud)

您的时间戳记是: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
Run Code Online (Sandbox Code Playgroud)