昨天的所有 MySQL 记录
Posted
技术标签:
【中文标题】昨天的所有 MySQL 记录【英文标题】:All MySQL records from yesterday 【发布时间】:2016-01-21 00:33:19 【问题描述】:获取日期时间字段介于昨天00:00:00
和昨天23:59:59
之间的所有记录的最有效方法是什么?
表:
id created_at
1 2016-01-19 20:03:00
2 2016-01-19 11:12:05
3 2016-01-20 03:04:01
假设昨天是 2016-01-19,那么在这种情况下,我只想返回第 1 行和第 2 行。
【问题讨论】:
【参考方案1】:由于您只查找日期部分,因此您可以使用 mysql's DATE()
function 轻松比较。
SELECT * FROM table WHERE DATE(created_at) = DATE(NOW() - INTERVAL 1 DAY);
请注意,如果您有大量记录,这可能是低效的; DATE()
的派生值失去了索引优势。在这种情况下,您可以使用以下查询:
SELECT * FROM table
WHERE created_at BETWEEN CURDATE() - INTERVAL 1 DAY
AND CURDATE() - INTERVAL 1 SECOND;
这是可行的,因为日期值(例如 CURDATE()
返回的日期值)假定时间戳为 00:00:00。索引仍然可以使用,因为日期列的值根本没有被转换。
【讨论】:
奇怪的是,它只返回今天而不是昨天的记录。SELECT @@global.time_zone, @@session.time_zone;
只是给我SYSTEM
两个值。当我检查数据库系统上的 TZ 时,它是 UTC,而我的是 EST。查询最终只能从远程系统上的脚本运行,所以我想这应该不是问题。
这就解释了。对我们北美人来说,UTC 目前是明天凌晨 1 点。
尝试将其更改为此以考虑 TZ,但现在即使我直接在远程系统上执行它,它也会从今天获取记录。有任何想法吗? DATE(CONVERT_TZ(created_at, '+00:00', '-05:00')) = DATE(CONVERT_TZ(NOW(), '+00:00', '-05:00') - INTERVAL 1 DAY)
如果您在远程系统上,则无需更改时区。只需使用答案中的查询即可。或者如果你不相信我,试试SELECT DATE(NOW() - INTERVAL 1 DAY)
;)【参考方案2】:
如果你说,你仍然可以使用索引
SELECT * FROM TABLE
WHERE CREATED_AT >= CURDATE() - INTERVAL 1 DAY
AND CREATED_AT < CURDATE();
【讨论】:
【参考方案3】:您可以使用subdate
表示“昨天”,并使用date()
表示您想要只有列的日期部分匹配的记录。所以:
SELECT *
FROM tablename
WHERE DATE(created_at) = SUBDATE(CURRENT_DATE(), INTERVAL 1 DAY)
【讨论】:
【参考方案4】:Here 是同一个问题的答案。要为您总结答案,请按照 Sajmon 的建议使用 subdate()。
subdate(currentDate, 1)
应该使用你的桌子。
select *
from tablename
where created_at between subdate(CURDATE(), 1)
and date (now() )
【讨论】:
【参考方案5】:使用:
subdate(current_date, 1)
这对你来说太棒了!
【讨论】:
这没有给我任何结果:select * from my_table where created_at = subdate(current_date, 1);
你是什么意思让这个在查询中使用?
select * from my_table where created_at > subdate(current_date, 1);
select * from my_table where created_at between subdate(current_date, 1) and current_date;
此查询将获取从昨天 00:00:00 到今天 00:00:00 的所有数据(我的意思是 24 小时),因为之前的查询将返回来自昨天到现在【参考方案6】:
选择子日期(当前日期(),1)
SELECT * FROM 表 WHERE created_at >= subdate(current_date(), 1)
【讨论】:
您好 Venkatesh,欢迎来到 ***!请使用代码 sn-ps 为您的 sql 命令和一些解释。这使它更容易阅读和理解;) 虽然此代码可能会解决问题,including an explanation 关于如何以及为什么解决问题将真正有助于提高您的帖子质量,并可能导致更多的赞成票。请记住,您正在为将来的读者回答问题,而不仅仅是现在提问的人。请edit您的回答添加解释并说明适用的限制和假设。【参考方案7】:你可以使用这个,只需输入tablename
和columnName
(包含 2021/01/09 或 2022-01-11 14:56:07 等)
select * from (TABLENAME) where DATE(columnNAME) = TODAY - 1;
【讨论】:
以上是关于昨天的所有 MySQL 记录的主要内容,如果未能解决你的问题,请参考以下文章