2016-05-16 124 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