2013-03-21 7 views
11

Ich bin eine Datenbank wie so abfragen:anzeigen leere Zeichenkette, wenn Datumsfeld ist 1/1/1900

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

lhd.CreatedDate ist ein Datetime-Feld und ist nicht auf NULL festlegbare. Ich möchte eine leere Zeichenfolge anzeigen, wenn das Feld das Mindestdatum (1/1/1900) ist, aber meine CASE-Anweisung funktioniert nicht; CreatedDate zeigt 1900-01-01 00: 00: 00.000 in meiner Abfrage an, wenn sich dieser Wert in der Datenbank befindet. Ich verwende SQL Server 2008 R2. Was mache ich falsch?

Antwort

20

Wenn Sie einen CASE Ausdruck verwenden (nicht Anweisung), müssen Sie die Priorität des Datentyps kennen. In diesem Fall können Sie nicht einfach einen auf einen leeren String setzen. Versuchen Sie es:

SELECT CONVERT(DATETIME, ''); 

Eine Abhilfe ist Ihr Datum als String vorstellen:

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 

Oder Sie könnten mit der Präsentation Zeug Geige, wo es an der Präsentationsebene gehört. Hier

ist ein Beispiel, das genau funktioniert, wie Sie scheinen zu wollen:

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; 

Ergebnisse:

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

Danke - ich bin nicht CreatedDate auf eine leere Zeichenfolge zu konvertieren versuchen, ich versuche, für seinen Wert und Ausgang entweder den Wert oder eine leere Zeichenfolge zu testen. Ich habe versucht, dies auch auf der Präsentationsebene zu tun, aber der Werttest funktioniert nicht. Wenn ich Ihre CASE-Anweisung versuche, bekomme ich immer noch 1900-01-01 00: 00: 00.000, wenn das Datum 1.1.1900 ist. – Melanie

+0

@Melanie Aber Sie versuchen, eine leere Zeichenfolge in ein Datetime konvertieren, wenn Sie dies getan: 'Fall wenn etwas dann '' ELSE SomeDateTime END' – Lamak

+0

@Melanie Ausgabe als String =' CONVERT' zu einer Zeichenfolge, auch wenn Sie didn sage nicht explizit 'CONVERT'. Sie können nicht einfach eine gültige "Datetime" in eine Zeichenfolge ändern. –

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

Bitte fügen Sie diesem Code einige Erläuterungen hinzu. –

0

Verwenden Sie diese innerhalb der Abfrage, keine Notwendigkeit, zusätzliche Variablen zu erstellen.

CASE WHEN CreatedDate = '19.000.101' THEN '' WHEN CreatedDate = '18.000.101' THEN '' ELSE CONVERT (CHAR (10), CreatedDate, 120) + '+ CONVERT (CHAR (8)' CreatedDate, 108) ENDE als 'Created Date'

Funktioniert wie ein Charme.

0

Zwei Nitpicks. (1) Am besten verwenden Sie keine String-Literale für Spaltenalias - das ist veraltet. (2) Verwenden Sie einfach Stil 120, um den gleichen Wert zu erhalten.

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

Während ich mit Nitpick 1 einverstanden bin, wo benutzt jemand auf dieser Seite ein String-Literal für einen Spaltenalias? –

1

Versuchen diesen Code

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

Eine alternative Lösung, die sowohl min (1.1.1900) und max (2079.06.06) Daten umfasst:

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

Welche Lösung auch immer Sie verwenden, sollten Sie eine Konvertierung Ihres Datum tun (oder Datetime) Feld zu einem bestimmten Format gegen andere Standardserverkonfigurationen in beschuss.

Siehe CAST und CONVERT auf MSDN: https://msdn.microsoft.com/en-us/library/ms187928.aspx

Verwandte Themen