You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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

火山引擎 最新活动