2016-05-16 4 views
0

Warum ist das Ergebnis dieser beiden nvarchar zu DateTime anders?Konvertieren von nvarchar zu DateTime gibt verschiedene Daten zurück

Declare @ApplyDate nvarchar(max) 
Set @ApplyDate = N'2014-01-01' 

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

Ergebnis ist:

Jan 1 2014 12:00AM 
Jul 6 1905 12:00AM 
+1

Warum speichern Sie ein Datum als Varchar? –

+0

@RichBenner Ich will nicht nur wissen warum wir das anders haben? – Behnam

Antwort

4

In dieser Abfrage:

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

Sie @ApplyDate ohne Anführungszeichen einfügen, die effektiv in dreht:

print CONVERT(datetime, 2014-01-01, 120) 

, die natürlich gleichwertig ist:

print CONVERT(datetime, 2012, 120) 

wo 2012 als Anzahl der Tage beginnend am 01.01.1900 gelesen wird.

Sie wahrscheinlich für (Anmerkung zusätzliches Paar von Anführungszeichen) suchen:

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

Sie haben zusätzliche einfache Anführungszeichen um String-Wert in Ihrem zweiten Beispiel verpasst haben, so dass es nicht als String anerkannt zu bekommen.

Es sollten beide Beispiele Ausgänge selben Tag In diesem Fall

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

sein.

1

In Ihrer EXEC Aussage, sind Sie die Anführungszeichen um @ApplyDate und es als eine numerische Berechnung geparst werden:

2014 - 01 - 01 = 2012 

die, wenn sie in ein Datum korrekt Jul 6 1905 12:00AM umgewandelt werden.

Versuchen:

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

in der 2. Sie das Ergebnis des Jahres 2014 minus 1 minus 1 bis heute konvertieren

siehe

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 
Verwandte Themen