我将用户的注册日期保存为日期时间格式,例如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
这样,但这看起来不太好。
你的问题在于缩写日期默认使用午夜作为时间。因此,你实际上查询的是:
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));
SELECT users.* FROM users WHERE created_at BETWEEN '2011-12-01' AND '2011-12-07';
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
DATE()
函数,如下所示。SELECT users.* FROM users WHERE DATE(created_at) BETWEEN '2011-12-01' AND '2011-12-06'
你是否尝试过使用“之前”和“之后”,而不是“>=”和“<=”?另外,这是一个日期还是时间戳?
搜索 created_at <= '2011-12-06'
将会搜索任何在 2011-12-06 午夜或之前创建的记录。你需要搜索的是 created_at < '2011-12-07'
。
或许可以使用中间值更好。对我来说,先获取范围再进行筛选是有效的。
您可以像下面这样使用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'
SELECT users.* from users WHERE created_at BETWEEN '2011-12-01' AND date_add('2011-12-01', INTERVAL 7 DAY);
- Leia