在 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());
我有一个日期存储在一个字符串 (@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());