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

22

我将用户的注册日期保存为日期时间格式,例如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个回答

50

你的问题在于缩写日期默认使用午夜作为时间。因此,你实际上查询的是:

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));

2
如果其他人在最后一个示例中遇到问题,请尝试以下语法:SELECT users.* from users WHERE created_at BETWEEN '2011-12-01' AND date_add('2011-12-01', INTERVAL 7 DAY); - Leia

9
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';

7
你需要将'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

+1 我认为我们恰好在同一时间发布了相同的答案 :-) - dash
@dash实际上比洛基早半分钟发布了答案,他的答案应该是被采纳的,但你更幸运。+1给他因为他回答更快,同时也+1给你因为你给了他+1。 - Racil Hilan

4
另一个选择是在左操作数上使用DATE()函数,如下所示。
SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06'

 


1

你是否尝试过使用“之前”和“之后”,而不是“>=”和“<=”?另外,这是一个日期还是时间戳?


我的错,之前和之后是来自其他地方的。对于时间戳,您需要添加时间和日期,就像其他人已经回答的那样。 - vextorspace

1

搜索 created_at <= '2011-12-06' 将会搜索任何在 2011-12-06 午夜或之前创建的记录。你需要搜索的是 created_at < '2011-12-07'


0

或许可以使用中间值更好。对我来说,先获取范围再进行筛选是有效的。


0

您可以像下面这样使用MySQL的DATE函数

例如,如果您想要在2017年9月5日至2017年9月9日期间获得结果

SELECT DATE(timestamp_field) as date FROM stocks_annc WHERE DATE(timestamp_field) >= '2017-09-05' AND DATE(timestamp_field) <= '2017-09-09'

请确保将日期用单引号''括起来。

编辑: 更好的解决方案是这样的。它会确保在存在索引的情况下使用索引。

select date(timestamp_field) as date from stocks_annc where time_stamp_field >= '2022-01-01 00:00:00' and time_stamp_field <= '2022-01-10 00:00:00'

希望这能帮到你。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接