You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

将存储为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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.21 12:20:02