为什么这两个nvarchar到DateTime的结果不同?
Declare @ApplyDate nvarchar(max)
Set @ApplyDate = N'2014-01-01'
Print CONVERT(datetime, @ApplyDate , 120)
Exec(' print CONVERT(datetime, ' + @ApplyDate + ', 120) ')
结果是:
Jan 1 2014 12:00AM
Jul 6 1905 12:00AM
答案 0 :(得分:4)
在此查询中:
Exec(' print CONVERT(datetime, ' + @ApplyDate + ', 120) ')
您插入的@ApplyDate
没有引号,实际上变成了:
print CONVERT(datetime, 2014-01-01, 120)
当然等同于:
print CONVERT(datetime, 2012, 120)
其中2012年被视为从1900-01-01开始的天数。
你可能正在寻找(注意另外一对报价):
Exec(' print CONVERT(datetime, ''' + @ApplyDate + ''', 120) ')
答案 1 :(得分:1)
在第二个示例中,您错过了字符串值附加的额外单引号,因此它不会被识别为字符串。
应该是
Exec(' print CONVERT(datetime, ''' + @ApplyDate + ''', 120) ')
在这种情况下,两个示例都输出相同的日期。
答案 2 :(得分:1)
在EXEC
语句中,您遗漏了@ApplyDate
周围的引号,并将其解析为数值计算:
2014 - 01 - 01 = 2012
当正确转换为日期Jul 6 1905 12:00AM
时。
尝试:
Exec(' print CONVERT(datetime, ''' + @ApplyDate + ''', 120) ')
答案 3 :(得分:0)
在第二个中,您将2014年的结果减去1减1到日期
见
Declare @ApplyDate nvarchar(max),
@str nvarchar(max)
Set @ApplyDate = N'2014-01-01'
Print CONVERT(datetime, @ApplyDate , 120)
Exec(' print CONVERT(datetime, ' + @ApplyDate + ', 120) ')
select @str = ' print CONVERT(datetime, ' + @ApplyDate + ', 120) '
print @str