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')
它有效,但我每次看到它时都会抽搐一点。其他人能写得更好吗?
先感谢您。
解决方案
无需格式化日期,它们默认为 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-06LAST_DAY()
那个日期是 2018-12-31+ INTERVAL 1 DAY
是2019-01-01
那么上限是:
- INTERVAL 1 MONTH
是2019-1-06LAST_DAY()
那个日期是 2019-1-31+ INTERVAL 1 DAY
是2019-02-01
日期应严格小于 2019-02-01。
在 23:59:59.000 和 23:59:59.999 之间,使用小于帐户来计算该月最后一秒的时间戳。
推荐阅读
- python - Pandas - 基于多列匹配替换行值
- python-3.x - Tensorflow2 ValueError:找不到匹配的函数来调用从 SavedModel 加载
- visual-studio-code - 如何在 Visual Studio Code 中自动设置语法突出显示的语言
- python - 每个产品按月绘制时间序列数据组
- javascript - 使用 javascript 插入 MySQL 数据库
- r - R - 类 AsIs 不适用于 sf 包
- c# - C# 中“async void”和跳过“await”关键字有什么区别?
- database - 如何使用 Flutter 删除 Firestore 字段数组的某些子项
- javascript - 如何制作一个机器人,如果在一条消息中标记了 4 个角色,机器人会禁止它们
- java - Rider 在 Mac 上使用的 java.security 文件的位置