【问题标题】:Get records for last 2 days获取最近 2 天的记录
【发布时间】:2024-01-17 11:24:02
【问题描述】:

我正在尝试创建一个查询来获取过去两天的记录。在我的表中有一个名为 dates 的字段。数值如下:

05-08-2018 08:05:22
05-08-2018 10:15:42

dd-mm-yyyy hh:ii:ss

我已经创建了查询。

SELECT id,title,description, dates
FROM post_feed where `dates` BETWEEN CURDATE() - INTERVAL 1 DAY AND CURDATE()
ORDER BY dates DESC LIMIT 100

当我运行查询时,它返回 0 条记录。日期格式似乎有问题。

【问题讨论】:

  • 正确存储日期

标签: mysql sql date datetime


【解决方案1】:

您的日期似乎存储为 varchar。在进行任何比较之前,您必须将它们转换为日期(例如,使用 STR_TO_DATE)。

例如,假设今天是 05 年 8 月,并且您想要 04 年 4 月和 05 年(含)的结果:

SELECT id, title, description, dates
FROM post_feed
WHERE STR_TO_DATE(dates, '%d-%m-%Y') BETWEEN CURRENT_DATE - INTERVAL 1 DAY AND CURRENT_DATE
ORDER BY dates DESC
LIMIT 100

SQL Fiddle

【讨论】:

  • Salman 我如何获取今天和昨天的记录。请指教。
  • 上述查询应该有效。实际上它将返回最近 48 小时之间的行。如果我正确理解您的问题,请将 where 子句更改为 WHERE STR_TO_DATE(dates, '%d-%m-%Y') BETWEEN CURDATE() - INTERVAL 1 DAY AND CURDATE()
  • @Ironic 查看修改后的答案。
【解决方案2】:

试试这个WHERE 子句:

WHERE STR_TO_DATE(dates, '%d-%m-%Y %H:%i:%s') BETWEEN DATE_ADD(CURDATE(), INTERVAL -2 DAY) AND CURDATE()

【讨论】:

  • 0 条记录通过使用您的查询返回。
  • @Ironic 看来您的日期格式不标准,因此您需要将其转换为正确的datetime 格式。尝试更新答案。
  • 感谢您的帮助。投票赞成。
【解决方案3】:

您的第二次约会在第一次约会之前。将较大的日期放在第一位,将较小的日期放在第二位。

   SELECT id,title,description, dates
    FROM post_feed where CAST(`dates`as date) BETWEEN  CURDATE() AND CURDATE() - INTERVAL 1 DAY 
    ORDER BY dates DESC LIMIT 100

【讨论】:

  • 您必须将“日期”列转换为“YYYY-MM-DD”格式。我已经用 typecast 更新了我的代码
  • CURDATE() - INTERVAL 1 DAY 小于 CURDATE()
  • 我想包含当前日期记录和最后日期记录。
  • 绝对错误。 BETWEEN caluse 期望按该顺序更小和更大的值。并且以错误格式存储的 CAST 日期只会导致 0000-00-00
【解决方案4】:

修复您的数据!您的查询不起作用,因为“日期”值存储为 text/varchar。这很容易解决:

update post_feed
    set dates = str_to_date(date, '%Y-%m-%d %H:%i:%s')

alter table post_feed
    modify column datetime;

瞧!您的查询现在可以工作了。

【讨论】: