首页/数据/SQL 速查/INTERVAL 运算的月底与语义细节
本包目录(311 条)
查询基础33 条连接与子查询40 条聚合与窗口函数54 条
函数速查60 条
变更与事务52 条性能与执行计划72 条

INTERVAL 运算的月底与语义细节

INTERVAL 的日期运算有隐含规则:加月遇到目标月天数不足会截到月末;'1 month' 与 '30 days' 并不等价。

SQL 速查数据更新于 2026-10-12

月底截断

月底截断
-- MySQL / PostgreSQL 行为一致:先加月再截到当月最后一天
SELECT DATE '2024-01-31' + INTERVAL 1 MONTH;  -- 2024-02-29(PG)
-- MySQL: SELECT '2024-01-31' + INTERVAL 1 MONTH;  -- 2024-02-29

month 与 day 不等价

month 与 day 不等价
SELECT DATE '2024-03-01' + INTERVAL '1 month' AS a,   -- 2024-04-01
       DATE '2024-03-01' + INTERVAL '30 days' AS b;  -- 2024-03-31
-- PG 还支持乘法:INTERVAL '1 day' * 7
加月规则结果日超过目标月天数时截到该月最后一天(29/30/31 自动处理)
链路坑连续加月会继承上次截断后的日期,如 1-31 → 2-29 → 3-29
DST带时区时间戳加 1 day 与加 24 hours 在夏令时切换日结果不同

易错点

  • 用“日期循环 + 每次加 1 个月”推进账期会因截断漂移,应按初始日期+n 个月重算
  • 把 '1 month' 当 '30 days' 记账会累计误差,按自然月的业务必须用月份单位

数据来源与参考

  • MySQL 8.0 Reference Manual · Date Arithmetic
  • PostgreSQL Documentation · Date/Time Functions and Operators
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌