MySQL - 当时间戳是日期的一部分时,如何查找昨天的记录

Posted

技术标签:

【中文标题】MySQL - 当时间戳是日期的一部分时,如何查找昨天的记录【英文标题】:MySQL - How to find records for yesterday when timestamp is part of date 【发布时间】:2020-10-05 15:14:41 【问题描述】:

我的 mysql 表存储带有日期/时间戳的记录。我想从昨天创建的表中查找记录(如创建日期为昨天 - 无论时间戳部分是什么)

下面是 db 记录的样子:

我尝试了以下选择(以及其他一些变体,但没有得到昨天日期的行。

SELECT m.meeting_id, m.member_id, m.org_id, m.title 
  FROM meeting m
 WHERE m.create_dtm = DATE_SUB(CURDATE(), INTERVAL 1 DAY)

不完全确定我需要如何构造 where 子句来获取昨天发生的会议 ID。任何帮助将不胜感激。

【问题讨论】:

您的查询只匹配昨天午夜的时间!你需要一个范围...... 【参考方案1】:

一种天真的方法会将创建时间戳截断至今,然后进行比较:

where date(m.create_dtm) = current_date - interval 1 day

但是直接对时间戳使用半开间隔要高效得多:

where m.create_dtm >= current_date - interval 1 day and m.create_dtm < current_date

【讨论】:

非常感谢。我曾考虑过您的第一个建议,但很高兴有一种更有效的方法。非常感谢 GMB! ...带有适当的索引【参考方案2】:

您可以尝试下一个查询:

SELECT 
    m.meeting_id, m.member_id, m.org_id, m.title, m.create_dtm
FROM meeting m
-- here we convert datetime to date for each row
-- it can be expensive for big table
WHERE date(create_dtm) = DATE_SUB(CURDATE(), INTERVAL 1 DAY);

SELECT 
    m.meeting_id, m.member_id, m.org_id, m.title, m.create_dtm
FROM meeting m
-- here we calculate border values once and use them
WHERE create_dtm BETWEEN DATE_SUB(CURDATE(), INTERVAL 1 DAY) AND DATE_SUB(CURDATE(), INTERVAL 1 SECOND);

这里是现场小提琴:SQLize.online

【讨论】:

以上是关于MySQL - 当时间戳是日期的一部分时,如何查找昨天的记录的主要内容,如果未能解决你的问题,请参考以下文章

时间戳是啥,通俗解释

MYSQL如何本月时间戳

MySQL - 如何查找日期在开始日期到结束日期之间的记录

从以下位置插入/转换日期:C++ 到 mySQL db

MySQL 5.7 时间戳字段显示日期时间?

MySQL:查找日期范围之间的缺失日期