2011-12-10 35 views
11

我已经将用户注册的日期保存为日期时间,因此,例如2011-12-06 10:45:36。我已经运行此查询和我预期这个项目 - 2011-12-06 10点45分36秒 - 将被选中:MySQL - 从两个日期之间的数据库中选择数据

SELECT `users`.* FROM `users` WHERE created_at >= '2011-12-01' AND 
created_at <= '2011-12-06' 

但并非如此。存在任何优雅的方式,如何选择这个项目?作为第一个想法,我得到了像2011-12-06 + 1,但这看起来不太好。

回答

25

你的问题是日期的短版采用午夜为默认值。所以你的查询实际上是:

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

也许用在两者之间更好。它为我工作得到范围,然后过滤它

1

你试过前后,而不是> =和< =?另外,这是一个日期或时间戳?

+0

是的,表中的列是时间戳 – user984621

+0

我的不好,前后都是别的。对于时间戳,您需要添加时间以及其他人已回答的日期。 – vextorspace

1

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

+0

明白,谢谢! – user984621

3

您需要使用'2011年12月7日'作为结束点作为没有时间默认的日期到时间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 
+0

+1我认为我们在同一时间发布了相同的答案:-) – dash

+0

@dash实际上Loki在半分钟之前发布了它,他本应该是被接受的答案,但是你更幸运。为他+1更快的回答,+1给你给他+1。 –

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

另一种方法是使用DATE()功能左手操作如下图所示

SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06' 

 

0

您可以使用MySQL DATE fu nction像下面

举例来说,如果你想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' 

确保包装单引号内的日期''

希望这有助于。

相关问题