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

War es hilfreich?

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.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top