2016-05-16 172 views
0

为什么这两个nvarchar与DateTime的结果不同?将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 
+1

首先,为什么要将日期存储为varchar? –

+0

@RichBenner我不只是想知道为什么我们有这种不同? – Behnam

回答

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

你已经错过了你的第二个例子左右字符串值额外的单引号,所以它不会识别为字符串。

它应该是

Exec(' print CONVERT(datetime, ''' + @ApplyDate + ''', 120) ') 

在这种情况下这两个实施例的输出相同的日期。

1

在你EXEC声明,你缺少周围@ApplyDate引号和它被解析为一个数值计算:

2014 - 01 - 01 = 2012 

,当转换成一个日期是正确Jul 6 1905 12:00AM

尝试:

Exec(' print CONVERT(datetime, ''' + @ApplyDate + ''', 120) ') 
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