【问题标题】:MySQL - How to find records for yesterday when timestamp is part of dateMySQL - 当时间戳是日期的一部分时,如何查找昨天的记录
【发布时间】: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。任何帮助将不胜感激。

【问题讨论】:

  • 您的查询只匹配昨天午夜的时间!你需要一个范围......

标签: mysql sql datetime where-clause


【解决方案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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-05-12
    • 2012-03-12
    • 1970-01-01
    • 1970-01-01
    • 2014-02-27
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多