mysql 中日期加减

等等,昨天写报表的时候还碰到个细节问题。
当时我在酒店等早餐,看看表,凌晨5 点。
想算算明天上午1 0点差多少时间,随手就在笔记本上敲了个 SELECT DATE_ADD(NOW(), INTERVAL 1 5 HOUR)。
结果弹出来是 2 02 5 -1 1 -1 8 02 :00:00,当时愣了一下,以为酒店钟错了。
后来才反应过来,原来是直接把时间加了,没考虑时区转换。
MySQL这函数是真厉害,连跨天都算进去了,但有时候也得手动调整下预期。
不像Excel,直接加1 5 小时还是凌晨2 点,至少提醒你一下。
这算不算个坑呢?

sql 中 dateadd 用法_sql 中 dateadd 增减日期的指南

说白了,DATEADD就是SQL里头处理日期加减的瑞士军刀,用起来贼方便但得注意数据库差异。

展开讲,它俩大关键点:先用datepart指定时间单位,比如年、月、天这种,比如去年我们跑那个电商项目,统计最近3 0天订单就得用DATEADD(day,-3 0,GETDATE());另外一点,number参数必须带符号,正数往后算,负数往前倒,有个细节挺关键的,比如Oracle直接用SYSDATE+5 天就行,但SQLServer需要CAST转成DATE类型才能去掉时间部分。
还有个细节挺关键的,按月分组时,用DATEADD(month,DATEDIFF(month,0,order_date),0)把日期标准化到每月第一天,去年我们汇总季度销售额时这么干,跑得又快又准。

我一开始也以为跨数据库直接复制粘贴就行,后来发现不对,比如PostgreSQL用INTERVAL,MySQL要加逗号,直接过来踩坑的团队说实话挺坑的。

提醒个容易踩的坑:DATEADD不会自动处理时区,比如用户在东京调用了DATEADD(day,1 ,NOW()),结果还是UTC时间往后加一天,这个点很多人没注意。

建议先在Postman里用不同DB的语法跑几条小SQL确认没问题,再写进业务代码。

SQL 日期函数如何加减日期?

SQL Server/Access: DATEADD函数。
语法:DATEADD(datepart, number, date)。
datepart:时间单位(day, month, year, hour等)。
number:增减数量(正数为加,负数为减)。
date:原始日期值。
示例:加7 天:DATEADD(day, 7 , '2 02 3 -1 0-01 ') 返回 2 02 3 -1 0-08 减1 个月:DATEADD(month, -1 , '2 02 3 -1 0-01 ') 返回 2 02 3 -09 -01
MySQL: DATE_ADD/DATE_SUB函数。
语法:DATE_ADD(date, INTERVAL expr unit)。
DATE_SUB(date, INTERVAL expr unit)。
expr:数值(5 , -2 )。
unit:时间单位(DAY, MONTH, HOUR等)。
示例:加5 天:DATE_ADD('2 02 3 -1 0-01 ', INTERVAL 5 DAY) 返回 2 02 3 -1 0-06 减2 个月:DATE_SUB('2 02 3 -1 0-01 ', INTERVAL 2 MONTH) 返回 2 02 3 -08 -01 加3 小时:DATE_ADD('2 02 3 -1 0-01 1 2 :00:00', INTERVAL 3 HOUR) 返回 2 02 3 -1 0-01 1 5 :00:00。

PostgreSQL: +/-运算符。
语法:date + INTERVAL 'value unit'。
date
INTERVAL 'value unit'。
value:数值(7 , 1 )。
unit:时间单位(days, months)。
示例:加7 天:'2 02 3 -1 0-01 '::date + INTERVAL '7 days' 返回 2 02 3 -1 0-08 减1 个月:'2 02 3 -1 0-01 '::date
INTERVAL '1 month' 返回 2 02 3 -09 -01
SQLite: date函数+修饰符。
语法:date(date, 'modifier')。
modifier:调整规则(+7 days, -1 month)。
示例:加7 天:date('2 02 3 -1 0-01 ', '+7 days') 返回 2 02 3 -1 0-08 减1 个月:date('2 02 3 -1 0-01 ', '-1 month') 返回 2 02 3 -09 -01
数据库差异:SQL Server用DATEADD。
MySQL用DATE_ADD/DATE_SUB+INTERVAL。
PostgreSQL用+/-运算符+INTERVAL。
SQLite用date函数+修饰符。

时间单位:通用单位:day, month, year, hour, minute。
MySQL/PostgreSQL支持更细粒度:SECOND, QUARTER。

负数处理:SQL Server直接传负数(-1 )。
MySQL用DATE_SUB或负INTERVAL(INTERVAL -1 MONTH)。

注意事项:跨数据库查询需调整语法。
月末加减可能导致日期溢出(如2 02 3 -01 -3 1 +1 month结果为2 02 3 -02 -2 8 )。
大量数据操作时,建议放在应用层处理。

sql里日期怎么加减

说实话,这SQL日期加减的操作啊,还真挺有意思的。
得看用哪个数据库。

就说MySQL吧,这货挺直接。
想加日子,用DATE_ADD函数。
比如,'2 02 3 -1 2 -01 ' DATE_ADD INTERVAL 7 DAY,这就等于加七天,变成'2 02 3 -1 2 -08 '了。
想减日子呢,就用DATE_SUB。
比如,'2 02 3 -1 2 -01 ' DATE_SUB INTERVAL 3 MONTH,这就等于减三个月,变成'2 02 3 -09 -01 '。

再看SQL Server,这货也还行。
用DATEADD函数。
比如,'2 02 3 -1 2 -01 ' DATEADD DAY 5 ,这就等于加五天,变成'2 02 3 -1 2 -06 '。
想减呢,就 DATEADD MONTH -3 不过这语法得记牢,别加错符号。

PostgreSQL就不太一样了。
这货用INTERVAL关键字。
比如,'2 02 3 -01 -01 '::date + INTERVAL '5 days',这就等于加五天,变成'2 02 3 -01 -06 '。
想减呢,就 '2 02 3 -04 -01 '::date
INTERVAL '3 months',等于减三个月,变成'2 02 3 -01 -01 '。

还有些数据库,比如Oracle啊,可以直接加减数字。
比如SYSDATE + 1 0,这就等于当前时间加十天。
但这种做法啊,得看具体数据库怎么支持,得查查官方文档。

不过说实话,这日期加减啊,最关键的是时区。
比如美国东部时间,加五天,得考虑夏令时。
'2 02 3 -1 1 -05 '加五天,可能变成'2 02 3 -1 1 -1 0',也可能变成'2 02 3 -1 1 -1 1 ',得看那天有没有夏令时转换。
所以用的时候,一定得注意时区问题。

总之,这SQL日期加减啊,得根据数据库来。
MySQL用DATE_ADD和DATE_SUB,SQL Server用DATEADD,PostgreSQL用INTERVAL。
直接加减数字的,得看数据库支持不。
最要紧的是时区,别搞错了。