昨天的所有 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 &gt; 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】:

你可以使用这个,只需输入tablenamecolumnName(包含 2021/01/09 或 2022-01-11 14:56:07 等)

select * from (TABLENAME) where DATE(columnNAME) = TODAY - 1;

【讨论】:

以上是关于昨天的所有 MySQL 记录的主要内容,如果未能解决你的问题,请参考以下文章

mysql查询今天,昨天,近7天,近30天,本月,上一月数据

选择昨天和今天之间的记录

使用日期时间字段选择昨天的记录

Postgres 选择从昨天开始存储为纪元的记录

MySQL:搜索从昨天下午 3 点到今天下午 4 点的订单

MYSQL怎么查询数据今天、昨天的数据?