将nvarchar转换为DateTime会返回不同的日期

时间:2016-05-16 13:14:14

标签: sql sql-server datetime type-conversion

为什么这两个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

4 个答案:

答案 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