编写基于差异的日期查询的更好方法

时间:2019-02-06 23:55:15

标签: mysql

我正在审查现有代码,并且发现以下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')

它有效,但是每次看到它我都会抽动一下。 有人能写得更好吗?

谢谢。

1 个答案:

答案 0 :(得分:1)

无需格式化日期,它们的默认格式为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年2月6日,则:

  • - 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之间使用少于时间戳的帐户。