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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 09:07:22