在 SQL Server 2017 中使用 DATEADD() 函数后日期不会改变

Date won't change after using DATEADD() function in SQL Server 2017

我有一个日期存储在一个字符串 (@cnp=1051597991234) 中,日期是 051597 代表 5/15/1997。我正在使用以下代码设置具有所需值的日期变量,最后计算当前年龄。

我使用了调试器,但不知何故它最终没有被设置并且 diff 也返回 null。

如果有人能帮助我将不胜感激

declare @cnp varchar(30) = 1051597991234;
declare @age int;
declare @dateBorn date = CAST('1900-01-01' AS DATETIME);

declare @dayBorn int;
declare @monthBorn int;
declare @yearBorn int;

set @dayBorn = cast(substring(@cnp, 2, 2) as int) - 1;
set @monthBorn = cast(substring(@cnp, 4, 2) as int) - 1;
set @yearBorn = cast(substring(@cnp, 6, 2) as int);

set @dateBorn = dateadd(yyyy, @yearBorn, @dateBorn);
set @dateBorn = dateadd(mm, @monthBorn, @dateBorn);
set @dateBorn = dateadd(dd, @dayBorn, @dateBorn);

set @age = datediff(year, getdate(), @dateBorn);

我可以建议使用 DATEFROMPARTS 函数吗?

所以:

DECLARE @dateBorn DATE = 
    DATEFROMPARTS(
        CAST('19' + SUBSTRING(@cnp,6,2) AS INT)
        ,CAST(SUBSTRING(@cnp,2,2) AS INT)
        ,CAST(SUBSTRING(@cnp,4,2) AS INT)
        );

DECLARE @age INT = 
    DATEDIFF(YEAR, GETDATE(), @dateBorn);

请注意,您拥有的生日字符串不是 Y2K 安全的,这就是为什么我放入一个常量以假设它们是在 20 世纪。

另请注意,您的日期采用美国格式,第一是月,第二是日,第三是年。

声明问题。只需更改此

declare @cnp = 1051597991234

有了这个

declare @cnp nvarchar(20) ='1051597991234'

并更改顺序,因为起始日期将是出生日期

set @age =datediff(year,@dateBorn,getdate());