我正在审查现有代码,并且发现以下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')
它有效,但是每次看到它我都会抽动一下。 有人能写得更好吗?
谢谢。
答案 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之间使用少于时间戳的帐户。