SQL Datumsart Range nach nicht der Spezifikation?
-
06-07-2019 - |
Frage
Nach MSDN den Bereich für Datum Datentyp ist der 1. Januar 1753 bis zum 31. Dezember 9999
In SQL2005 folgenden interessant:
declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date
if (isnull(@date,0) = 0) SELECT 'date is null' ELSE SELECT 'date not null'
das Datum ändern und plötzlich '1/1/1901 12:00:00 AM'
isnull(@date,0)
ist 0.
Was bin ich fehlt?
(Edit) fixiert daterange für sql2005, Link zu sql2005 BOL
Lösung
Versuchen Sie folgendes:
declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date, CASE WHEN @date IS NULL THEN 'date is null' ELSE 'date not null' END
Andere Tipps
declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date
if @date is null SELECT 'date is null' ELSE SELECT 'date not null'
ISNULL()
ist eine Konvertierungsfunktion. Es ist nicht die Prüfung, ob ein Wert NULL
ist.
Ein Datum hat eine numerische Darstellung. Die numerische Darstellung von '1/1/1901 12:00:00 AM'
geschieht auf SQL Server 0
, werden.
Sie können nicht das Ergebnis von ISNULL(@date,0)
vergleichen, ohne dabei die Fähigkeit zu 0
zwischen einem Zeitpunkt, zu unterscheiden, die als 0
und einem Datum dargestellt werden könnten, die NULL
ist.
Die Codezeile unten ist irreführend:
if (isnull(@date,null) = 0) SELECT 'date is null' ELSE SELECT 'date not null'
Diese Zeile liefert 0, wenn @date
== 0, nicht , wenn es null ist. Das Datum, das Sie angegeben haben, wird als 0 in einem Datetime gespeichert.
SELECT convert(datetime, 0)
, um zu sehen, was ich meine!
Ich habe versucht, dies:
declare @date as datetime
SET @date = '1/1/1901 12:00:00 AM'
SELECT @date, CONVERT(numeric(9,3), @date) as DateValue
if (isnull(@date,0) = 0) SELECT 'date is zero' ELSE SELECT 'date not equal to zero (THIS PRINTS)'
if (isnull(@date,0) = 365) SELECT 'date is 365 (THIS PRINTS)' ELSE SELECT 'date not equal to zero'
if (@date = 365) SELECT 'date is 365 (THIS PRINTS)' ELSE SELECT 'date not 365'
SET @date = '1/1/1900 12:00:00 AM'
SELECT @date, CONVERT(numeric(9,3), @date) as DateValue
if (isnull(@date,0) = 0) SELECT 'date is equal to Zero (THIS PRINTS)' ELSE SELECT 'date not null'
if (@date = 0) SELECT 'date is equal to Zero (THIS PRINTS)' ELSE SELECT 'date not null'
Es ist nichts falsch mit ISNULL noch mit COALESCE. Das Problem ist, dass Sie mit Null vergleichen, und täuschen Sie sich zu denken, dass die ISNULL gekickt. Versuchen Sie meinen Code, und sehen, dass ISNULL den richtigen Wert zurückgibt.