2013-03-21 8 views
11

ja zapytań do bazy danych tak:Pokaż pusty ciąg, gdy pole jest data 01.01.1900

SELECT DISTINCT 
CASE WHEN CreatedDate = '1900-01-01 00:00:00.000' THEN '' ELSE CreatedDate END AS CreatedDate 
FROM LitHoldDetails 

lhd.CreatedDate jest polem DateTime i nie jest pustych. Chcę wyświetlić pusty ciąg znaków, jeśli pole jest datą minimalną (1/1/1900), ale moje polecenie CASE nie działa; W oknie dialogowym CreateDate wyświetla się 1900-01-01 00: 00: 00.000, gdy ta wartość znajduje się w bazie danych. Używam programu SQL Server 2008 R2. Co ja robię źle?

Odpowiedz

20

Podczas korzystania z wyrażenia CASE (nie oświadczenie) musisz mieć świadomość pierwszeństwa typu danych. W takim przypadku nie można po prostu ustawić wartości DATETIME na pusty ciąg znaków. Spróbuj go:

SELECT CONVERT(DATETIME, ''); 

Jeden obejście jest przedstawienie datę jako ciąg:

CASE WHEN CONVERT(DATE, CreatedDate) = '1900-01-01' -- to account for accidental time 
    THEN '' 
    ELSE CONVERT(CHAR(10), CreatedDate, 120) 
    + ' ' + CONVERT(CHAR(8), CreatedDate, 108) 
END 

Albo można bawić z rzeczy prezentacji, gdzie należy, w warstwie prezentacji.

Oto przykład, który działa dokładnie tak, jak wydają się chce:

DECLARE @d TABLE(CreatedDate DATETIME); 

INSERT @d SELECT '19000101' UNION ALL SELECT '20130321'; 

SELECT d = CASE WHEN CreatedDate = '19000101' 
    THEN '' 
    ELSE CONVERT(CHAR(10), CreatedDate, 120) 
    + ' ' + CONVERT(CHAR(8), CreatedDate, 108) 
END FROM @d; 

Wyniki:

d 
------------------- 
        <-- empty string 
2013-03-21 00:00:00 
+0

Dzięki - Nie próbuję przekonwertować CreatedDate na pusty ciąg, próbuję przetestować jej wartości i wyjściu obu jej wartości lub pusty ciąg. Próbowałem to zrobić również w warstwie prezentacji, ale test wartości nie działa. Kiedy wypróbuję twoje polecenie CASE, nadal otrzymuję 1900-01-01 00: 00: 00.000, kiedy data to 1/1/1900. – Melanie

+0

@Melanie Ale próbujesz przekonwertować pusty ciąg na datetime, kiedy to zrobiłeś: 'CASE WHEN THEN '' ELSE SomeDateTime END' – Lamak

+0

@Mananie wypisz jako ciąg =' CONVERT' na ciąg znaków, nawet jeśli zrobiłeś "Wyraźnie powiedz" CONVERT ". Nie możesz po prostu magicznie zmienić poprawnego 'datetime' na ciąg znaków. –

5
select ISNULL(CONVERT(VARCHAR(23), WorkingDate,121),'') from uv_Employee 
+3

Proszę dodać wyjaśnienie do tego kodu. –

0

Użyj tego wewnątrz zapytania, nie ma potrzeby tworzenia dodatkowych zmiennych.

przypadku, gdy CreatedDate = '19000101', a następnie '', gdy CreatedDate = '18000101', a następnie '' else konwertowania (CHAR (10) CreatedDate, 120) + '' + konwertowania (CHAR (8) CreatedDate, 108) END jako "Data utworzenia"

Działa jak urok.

0

Dwie wykałaczki. (1) Najlepiej nie używać literałów łańcuchowych dla aliasu kolumny - to jest przestarzałe. (2) Po prostu użyj stylu 120, aby uzyskać tę samą wartość.

CASE 
     WHEN CreatedDate = '19000101' THEN '' 
     WHEN CreatedDate = '18000101' THEN '' 
     ELSE Convert(varchar(19), CreatedDate, 120) 
    END AS [Created Date] 
+0

Podczas gdy zgadzam się z Nitpick 1, gdzie jest ktoś na tej stronie za pomocą literału ciągu dla aliasu kolumny? –

1

Spróbuj kod

(case when CONVERT(VARCHAR(10), CreatedDate, 103) = '01/01/1900' then '' else CONVERT(VARCHAR(24), CreatedDate, 121) end) as Date_Resolved 
0

alternatywne rozwiązanie, które obejmuje zarówno min (1/1/1900) i maksymalnej (6/6/2079) terminy:

ISNULL (nullif (NULLIF (CONVERT (VARCHAR (10), CreatedDate, 120), '1900-01-01'), '2079-06-06'), '').

Niezależnie od tego, jakiego rozwiązania używasz, powinieneś dokonać konwersji pola daty (lub datetime) do określonego formatu, aby uzyskać ochronę kuloodporną przed różnymi domyślnymi konfiguracjami serwerów.

See CAST i CONVERT na MSDN: https://msdn.microsoft.com/en-us/library/ms187928.aspx

Powiązane problemy