SQL Server Isnull Zwraca 1900-01-01, gdy pole jest puste

15

Poniższy fragment kodu zwraca 1900-01-01, gdy pole DOB jest puste. Chciałem (i oczekiwałem), że zwróci pusty ciąg (''), ale tak nie jest. Jak powinienem uzyskać pożądane wyniki?

isnull(convert(date,DOB,1),'')
Juan Velez
źródło
5
Za bardzo mieszasz typy danych. Zasadniczo to, co robisz z NULLdatami, mówi SELECT CAST('' AS DATE). Jaki jest typ danych DOB?
Mark Sinkinson
1
jest to typ danych varchar, który obecnie konwertuję
Juan Velez
5
Wiem, że to stary post, ale warto wspomnieć, że wygląda na to, że próbujesz sformatować dane w języku SQL zamiast pozwolić, aby warstwa aplikacji zrobiła to za Ciebie. 99,9% czasu lepiej jest pozwolić, aby warstwa aplikacji dokonała formowania.
Erik,

Odpowiedzi:

21

Nie możesz uzyskać pustego ciągu, ponieważ zwracasz DATEtyp wartości z ISNULL.

Według MSDN ,ISNULL

Zwraca ten sam typ co wyrażenie_kontrolne. Jeśli dosłowny NULL jest podany jako wyrażenie_kontrolne, zwraca typ danych wartości zastępczej. Jeśli literał NULL jest podany jako check_expression i nie podano wartości zastępczej, zwraca int.

Jeśli sprawdzasz, czy wartość jest NULL, czy nie , nie ma potrzeby konwertowania jej na datę, chyba że chcesz zwrócić wartość daty (której nie wydaje się).

Zamiast tego użyj:

SELECT ISNULL( DOB , '')

Który wróci

''

jeśli wartość wynosi NULL.

NULLData jest NULL(brak wartości). Z drugiej strony pusty ciąg znaków ocenia 0, co w SQL Server jest domyślnie liczbą całkowitą reprezentującą liczbę dni od tego czasu 1900-01-01.

LowlyDBA
źródło
-3

Jeśli chcesz zwrócić wartość DOB, gdy jest ona wypełniona, i usuń wartość zerową, gdy nie ma zapełnionej DOB. Możesz spróbować, ale DOB będzie varchar, a nie typem daty.

isnull(cast(cast(DOB as date)as varchar),'') as DOB   (SQL SERVER)
Elvis Candelaria
źródło
2
Przesłanie VARCHARdo DATEai powrót do a VARCHARnie ma żadnego sensu. Kiedy usuniesz te bzdury, twoja odpowiedź będzie taka sama, jak odpowiedź zaakceptowana z mniejszą ilością informacji.
Erik,
Tak, w twoim scenariuszu nie miałoby to sensu, ale w scenariuszu, w którym go użyłem, zacząłem od datetimei potrzebowałem tylko daty w YYYY-MM-DD. Więc rzucając, gdy dateupuszczam czas. Następnie rzutowanie varcharpozwala na użycie isnullfunkcji. Więc nadal otrzymuję datę dla zapełnionych rekordów i usuwam wartości null. W przeciwnym razie dostawałem 1900-01-01 00:00:00.000.
Elvis Candelaria,
1
To nie jest mój scenariusz, to scenariusz pytania. Uważam, że dlatego zbieracie głosy negatywne. W rzeczywistości próbujesz odpowiedzieć na inne pytanie.
Erik,
Tak masz rację. Źle to przeczytałem. Moja wina.
Elvis Candelaria,
-3

Spowoduje to konwersję daty NULL na spację. Warstwa aplikacji (Excel) dobrze obsługuje przestrzeń

ISNULL (CONVERT(varchar(50), w.TRANSACTIONDT, 120), '')  as wTRANSACTIONDT
SQLjj
źródło
-3

Po prostu utwórz widok

UTWÓRZ WIDOK test_view
JAK
WYBIERZ przypadek, gdy rok (DOB) <= 1900, a następnie zerowy, inaczej DOB kończy się jako DOB, czasami identyfikator z testu;

a następnie użyj jej zamiast oryginalnej tabeli: wybierz * z widoku_testu

użytkownik99852
źródło
-5

posługiwać się

wybierz isnull (Konwertuj (Varchar (500), Data, 106), '')

to działa

ramchandra bobhate
źródło
2
A dlaczego to dobry pomysł?
dezso
1
Jest to zasadniczo identyczna z odpowiedzią SQLjj .
Andriy M