SQL Server Isnull Gibt 1900-01-01 zurück, wenn das Feld null ist


14

Der folgende Code gibt 1900-01-01 zurück, wenn das DOB-Feld null ist. Ich wollte (und erwartete), dass es eine leere Zeichenfolge ('') zurückgibt, aber es ist nicht. Wie soll ich vorgehen, um die gewünschten Ergebnisse zu erzielen?

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

5
Sie mischen die Datentypen zu stark durch. Im Wesentlichen NULLsagen Sie, was Sie mit Datteln tun SELECT CAST('' AS DATE). Welcher Datentyp ist DOB?
Mark Sinkinson

1
Es ist ein Varchar-Datentyp, den ich in Datum konvertiere
Juan Velez

5
Ich weiß, dass dies ein alter Beitrag ist, aber es ist erwähnenswert, dass es so aussieht, als würden Sie versuchen, die Daten in SQL zu formatieren, anstatt die Anwendungsebene dies für Sie tun zu lassen. In 99,9% der Fälle ist es besser, die Anwendungsschicht die Formatierung durchführen zu lassen.
Erik

Antworten:


19

Sie können keine leere Zeichenfolge abrufen, da Sie den DATEWerttyp von zurückgeben ISNULL.

Per MSDN ,ISNULL

Gibt den gleichen Typ wie check_expression zurück. Wenn als check_expression ein Literal NULL angegeben wird, wird der Datentyp des replacement_value zurückgegeben. Wenn als check_expression ein Literal NULL angegeben wird und kein replacement_value angegeben wird, wird ein int zurückgegeben.

Wenn Sie prüfen, ob der Wert NULLein Datum ist, müssen Sie ihn nicht in ein Datum umwandeln, es sei denn, Sie möchten einen Datumswert zurückgeben (was Sie anscheinend nicht möchten).

Verwenden Sie stattdessen:

SELECT ISNULL( DOB , '')

Welches wird zurückkehren

''

wenn der Wert ist NULL.

Ein NULLDatum ist NULL(kein Wert). Eine leere Zeichenfolge hingegen 0ergibt, was in SQL Server implizit eine Ganzzahl ist, die die Anzahl der Tage seit dem darstellt 1900-01-01.


-3

Wenn Sie einen Wert für DOB zurückgeben möchten, wenn er ausgefüllt ist, und den Nullwert entfernen möchten, wenn kein DOB ausgefüllt ist. Sie können dies versuchen, aber das DOB ist ein varchar und kein Datumstyp.

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

2
Das Casting von a VARCHARnach a DATEund zurück zu a VARCHARergibt keinen Sinn. Wenn Sie diesen Unsinn entfernen, entspricht Ihre Antwort der akzeptierten Antwort mit weniger Erläuterungen.
Erik

Ja, in Ihrem Szenario wäre das nicht sinnvoll, aber in dem Szenario, für das ich es verwendet habe, habe ich mit einem datetimeDatum begonnen, für das nur ein Datum erforderlich ist YYYY-MM-DD. Also beim Casting wie dateich die Zeit vergesse. Das anschließende Casting varcharermöglicht die Nutzung der isnullFunktion. Also bekomme ich immer noch ein Datum für die ausgefüllten Datensätze und entferne die Nullwerte. Ansonsten bekam ich 1900-01-01 00:00:00.000.
Elvis Candelaria

1
Es ist nicht mein Szenario, es ist das Szenario der Frage. Ich glaube, deshalb sammeln Sie Abstimmungen. Sie versuchen tatsächlich, eine andere Frage zu beantworten.
Erik

Ja, du hast recht. Ich habe das falsch gelesen. Mein Fehler.
Elvis Candelaria

-3

Das wird das NULL-Datum in Leerzeichen konvertieren. Die Anwendungsebene (Excel) verarbeitet den Platz gut

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

-3

Erstellen Sie einfach eine Ansicht

CREATE VIEW test_view
AS
SELECT-Fall, wenn year (DOB) <= 1900, dann null, sonst endet DOB als DOB, sometext, id from test;

Verwenden Sie stattdessen die Originaltabelle: Wählen Sie * aus test_view


Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.