如何在SQL中添加日期?日期加减操作(DATEADD函数)报错如何解决?
SQL日期操作全解(含你遇到的DATEADD错误排查)
嘿,我来帮你一步步解决这些日期相关的问题,包括你碰到的那个DATEADD报错~
1. 如何在SQL中添加日期?
分两种常见场景来说:
- 插入新记录时添加日期值:直接用标准格式的日期字符串,或者用内置函数生成当前日期(不同SQL方言函数不同):
-- 插入指定日期(推荐用yyyy-mm-dd或yyyyMMdd格式) INSERT INTO your_table (date_column) VALUES ('2024-05-20'); -- 插入当前系统日期(SQL Server) INSERT INTO your_table (date_column) VALUES (GETDATE()); -- 插入当前系统日期(MySQL) INSERT INTO your_table (date_column) VALUES (CURDATE()); - 给现有日期字段添加偏移量:这其实属于日期加减操作,我在下面第二部分详细说明~
2. 如何对日期进行加减操作?
不同SQL数据库的函数略有差异,这里重点说你用到的SQL Server,顺带提MySQL:
- SQL Server:用
DATEADD函数,语法是DATEADD(datepart, number, date),number为正就是加,负就是减:-- 给日期加1个月 SELECT DATEADD(month, 1, '2017-08-25') AS NewDate; -- 给当前日期减3天 SELECT DATEADD(day, -3, GETDATE()) AS PreviousDate; - MySQL:可以用
DATE_ADD/DATE_SUB,或者直接用加减运算符:-- 加1个月 SELECT DATE_ADD('2017-08-25', INTERVAL 1 MONTH) AS NewDate; -- 减3天 SELECT '2017-08-25' - INTERVAL 3 DAY AS PreviousDate;
3. 解决DATEADD报错:Msg 242, Level 16, State 3
你遇到的这个错误,核心原因是日期字符串的格式和数据库默认的解析格式不匹配!比如你的SQL Server会话默认日期格式是dd/mm/yyyy,那'2017-08-25'会被错误解析为「日=2017,月=08」,这显然超出了日期的合法范围(月份最大12,日期最大31),所以抛出转换错误。
给你几个靠谱的解决方法:
- 用无歧义的日期格式:SQL Server官方推荐
yyyyMMdd(不带分隔符)或者yyyy-MM-ddTHH:mm:ss这种格式,不管系统语言设置都能正确解析:SELECT DATEADD(month, -1, '20170825') AS DATEADD; -- 最推荐的格式 -- 或者带时间的格式 SELECT DATEADD(month, -1, '2017-08-25T00:00:00') AS DATEADD; - 显式转换日期类型:用
CONVERT函数指定格式代码(23对应ISO8601的yyyy-mm-dd格式):SELECT DATEADD(month, -1, CONVERT(datetime, '2017-08-25', 23)) AS DATEADD; - 临时修改会话的日期格式:如果你需要保持原字符串格式,可以先设置会话的日期解析规则:
SET DATEFORMAT ymd; -- 设置为年-月-日的解析顺序 SELECT DATEADD(month, -1, '2017-08-25') AS DATEADD;
内容的提问来源于stack exchange,提问作者Nandhu




