将存储为Decimal(9,0)的SQL日期转换并实现减一年操作求助
解决方案
你的错误根源是用Format把日期转成了dd/MM/yyyy格式的字符串,传给DateDiff时SQL会尝试将其转换为datetime类型,但这种格式依赖服务器的区域设置,一旦日期中的日大于12(比如13/05/2024),就会因为月份超出范围报错。
直接跳过字符串格式化步骤,把Decimal(9,0)类型的日期值直接转换为date类型即可,推荐以下两种方法:
方法1:使用Convert指定ISO格式(最安全)
假设DOCDATE存储的是YYYYMMDD格式的数字(比如20240520),直接转换:
CONVERT(date, CAST([DOCDATE] AS VARCHAR(8)), 112)
- 样式
112对应ISO标准的YYYYMMDD格式,转换不受区域设置影响,不会出现范围错误。
方法2:直接Cast转换(适用于SQL Server 2012+)
如果你的SQL Server版本支持,也可以直接把数字转成date:
CAST(CAST([DOCDATE] AS VARCHAR(8)) AS DATE)
实现减一年操作
如果是要得到该日期减一年后的结果,用DATEADD:
DATEADD(year, -1, CONVERT(date, CAST([DOCDATE] AS VARCHAR(8)), 112))
如果是要计算该日期与起始日期的年差(比如你之前用的DateDiff(year, -1, ...),-1对应1900-01-01),直接用转换后的date类型:
DATEDIFF(year, '1900-01-01', CONVERT(date, CAST([DOCDATE] AS VARCHAR(8)), 112))
(直接写'1900-01-01'比-1更直观,避免歧义)
内容的提问来源于stack exchange,提问作者Jub666
相关产品推荐
相关产品推荐

