MS SQL Server动态SQL中字符串转datetime返回错误日期求助
解决MS SQL Server动态SQL日期转换错误的问题
问题原因
问题出在动态SQL的字符串拼接逻辑上:当直接拼接@BEFOREDATE变量时,生成的SQL语句会变成:
select CONVERT(DATETIME,13/12/2019,103)
这里的13/12/2019被SQL Server当作数值除法运算(13÷12÷2019),得到一个极小的小数。当将这个小数转换为DATETIME类型时,SQL Server会把它视为从基准日期1900-01-01开始偏移的天数,因数值不足1天,最终返回错误的1900-01-01 00:00:00.000。
解决方案
方法1:给日期字符串添加转义单引号
拼接时为日期字符串加上单引号(SQL中用两个单引号表示转义的单引号),确保日期被识别为字符串而非数值运算:
DECLARE @BEFOREDATE varchar(30) DECLARE @SqlStatment VARCHAR(1000) BEGIN SET @BEFOREDATE = '13/12/2019' -- 给日期字符串添加转义单引号 SET @SqlStatment = 'select CONVERT(DATETIME,''' + @BEFOREDATE + ''',103)' EXECUTE( @SqlStatment ) END
执行后生成正确的SQL语句:
select CONVERT(DATETIME,'13/12/2019',103)
返回结果:2019-12-13 00:00:00.000
方法2:使用参数化动态SQL(推荐)
参数化方式可以避免SQL注入风险,同时让逻辑更安全可靠:
DECLARE @BEFOREDATE varchar(30) DECLARE @SqlStatment NVARCHAR(1000) -- 注意使用NVARCHAR类型 BEGIN SET @BEFOREDATE = '13/12/2019' -- 定义参数化的动态SQL SET @SqlStatment = N'select CONVERT(DATETIME,@DateParam,103)' -- 通过sp_executesql传入参数 EXEC sp_executesql @SqlStatment, N'@DateParam VARCHAR(30)', @DateParam = @BEFOREDATE END
内容的提问来源于stack exchange,提问作者Debraj Bhowmik
相关产品推荐
相关产品推荐

