SQL Server non restituisce 1900-01-01 quando il campo è null


15

La seguente parte di codice restituisce 1900-01-01 quando il campo DOB ​​è null. Volevo (e mi aspettavo) che restituisse una stringa vuota ('') ma non lo è. Come devo procedere per ottenere i risultati desiderati?

isnull(convert(date,DOB,1),'')

5
Stai mescolando troppo i tipi di dati. In sostanza quello che stai facendo con le NULLdate sta dicendo SELECT CAST('' AS DATE). Che tipo di dati è DOB?
Mark Sinkinson,

1
è un tipo di dati varchar che sto convertendo fino ad oggi
Juan Velez,

5
So che questo è un vecchio post, ma vale la pena ricordare che sembra che tu stia provando a formattare i dati in SQL invece di lasciare che il livello dell'applicazione lo faccia per te. Il 99,9% delle volte è meglio lasciare che il layer dell'applicazione esegua la formattazione.
Erik,

Risposte:


20

Non puoi ottenere una stringa vuota perché stai restituendo il DATEtipo di valore da ISNULL.

Per MSDN ,ISNULL

Restituisce lo stesso tipo di check_expression. Se viene fornito un valore NULL letterale come check_expression, restituisce il tipo di dati di sostituzione_valore. Se viene fornito un valore NULL letterale come check_expression e non viene fornito alcun valore sostitutivo, viene restituito un int.

Se stai verificando se il valore è o meno NULL, non è necessario convertirlo in una data, a meno che tu non voglia restituire un valore di data (che non sembri).

Invece, usa:

SELECT ISNULL( DOB , '')

Che tornerà

''

se il valore è NULL.

Una NULLdata è NULL(nessun valore). Una stringa vuota, d'altra parte, valuta 0, che in SQL Server è implicitamente un numero intero che rappresenta il numero di giorni da allora 1900-01-01.


-3

Se si desidera restituire un valore per DOB quando viene popolato e rimuovere il valore null in assenza di DOB popolato. Puoi provare questo, ma il DOB sarà un varchar e non un tipo di data.

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)

2
Lanciare a VARCHARin a DATEe tornare a a VARCHARnon ha alcun senso. Quando rimuovi questa assurdità la tua risposta è la stessa della risposta accettata con meno esposizione.
Erik,

Sì, nel tuo scenario non avrebbe senso, ma nello scenario per cui l'ho usato, ho iniziato con una datetimedata necessaria e solo in YYYY-MM-DD. Quindi, lanciando mentre datefaccio cadere il tempo. Quindi lanciare il varcharpermette l'uso della isnullfunzione. Quindi ottengo ancora una data per i record popolati e rimuovo i valori null. Altrimenti, stavo ottenendo 1900-01-01 00:00:00.000.
Elvis Candelaria,

1
Non è il mio scenario, è lo scenario della domanda. Credo sia per questo che stai raccogliendo voti negativi. In effetti stai cercando di rispondere a una domanda diversa.
Erik,

Si hai ragione. L'ho letto male. Colpa mia.
Elvis Candelaria,

-3

Questo convertirà la data NULL in spazio. Il livello applicazione (Excel) gestisce bene lo spazio

ISNULL (CONVERT(varchar(50), w.TRANSACTIONDT, 120), '')  as wTRANSACTIONDT

-3

Basta creare una vista

CREATE VIEW test_view Caso
AS
SELECT quando anno (DOB) <= 1900, quindi null DOB fine come DOB, in qualche modo, ID dal test;

e poi usalo invece nella tabella originale: seleziona * da test_view


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.