Domanda

Secondo MSDN l'intervallo per data datatype è 1 gennaio 1753, fino al 31 dicembre 9999

In SQL2005 è interessante quanto segue:

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'

cambia la data in '1/1/1901 12:00:00 AM' e improvvisamente non è (@ date, 0) è 0.

Cosa mi sto perdendo?

(Modifica) daterange fisso per sql2005, collegamento a sql2005 BOL

È stato utile?

Soluzione

Prova questo:

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

Altri suggerimenti

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 () è una funzione di conversione. Non è il controllo se un valore è NULL .

Una data ha una rappresentazione numerica. La rappresentazione numerica di '1/1/1901 12:00:00 AM' sembra essere 0 , su SQL Server.

Non puoi confrontare il risultato di ISNULL (@ date, 0) con 0 senza perdere la possibilità di distinguere tra una data che potrebbe essere rappresentata come 0 e una data che è NULL .

La seguente riga di codice è fuorviante:

if (isnull(@date,null) = 0) SELECT 'date is null' ELSE SELECT 'date not null'

Questa riga restituisce 0 se @date == 0, non quando è null. La data specificata viene memorizzata come 0 in un datetime.

SELECT convert(datetime, 0)

per vedere cosa intendo!

Ho provato questo:

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'

Non c'è niente sbagliato con ISNULL né con COALESCE. Il problema è che stai confrontando con zero e ti illudi nel pensare che l'ISNULL abbia preso il via. Prova il mio codice e verifica che ISNULL restituisca il valore corretto.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top