首页 > 解决方案 > 编写基于差异的日期查询的更好方法

问题描述

我正在审查现有代码,并发现以下 SQL 查询用于获取上个月的记录选择。

是否有更简洁的 SQL 编写方式来完成 MySQL 中这个基于日期的子句的工作?

SELECT foo
FROM some_table
WHERE some_date 
BETWEEN 
    DATE_FORMAT(LAST_DAY((NOW() - INTERVAL 1 MONTH) - INTERVAL 1 SECOND), '%Y-%m-01 00:00:00')
AND 
    DATE_FORMAT(LAST_DAY((NOW() - INTERVAL 1 MONTH) - INTERVAL 1  SECOND), '%Y-%m-%d 23:59:59')

它有效,但我每次看到它时都会抽搐一点。其他人能写得更好吗?

先感谢您。

标签: mysql

解决方案


无需格式化日期,它们默认为 YYYY-MM-DD 00:00:00。

这有点简单:

SELECT foo 
FROM some_table
WHERE some_date >= LAST_DAY(CURDATE() - INTERVAL 2 MONTH) + INTERVAL 1 DAY
AND some_date < LAST_DAY(CURDATE() - INTERVAL 1 MONTH) + INTERVAL 1 DAY

所以如果CURDATE()是今天,2019-02-06,那么:

  • - INTERVAL 2 MONTH是2018-12-06
  • LAST_DAY()那个日期是 2018-12-31
  • + INTERVAL 1 DAY是2019-01-01

那么上限是:

  • - INTERVAL 1 MONTH是2019-1-06
  • LAST_DAY()那个日期是 2019-1-31
  • + INTERVAL 1 DAY是2019-02-01

日期应严格小于 2019-02-01。

在 23:59:59.000 和 23:59:59.999 之间,使用小于帐户来计算该月最后一秒的时间戳。


推荐阅读