Ich muss alle Monate in eine zweistellige Zahl umwandeln, wenn ich so aussehe:
1,2,3,4,5,6,7,8,9,10,11,12
Dazu:
01,02,03,04,05,06,07,08,09,10,11,12
Also habe ich eine einfache CASE-Anweisung zusammengestellt, um zu überprüfen, ob der Wert für die Länge des Monats = 1 ist, und dann eine führende Null hinzugefügt, andernfalls wie folgt:
SELECT
CASE
WHEN LEN(MONTH(GETDATE())) = 1
THEN RIGHT('0' + CONVERT(VARCHAR(2), MONTH(GETDATE())), 2)
ELSE MONTH(GETDATE())
END
Wir sind im April und das Ergebnis dieser Operation ist '4' anstatt '04'. Bei der Überprüfung der Anweisung (ohne die bedingte Anweisung):
right('0' + convert(varchar(2),month(getdate())),2)
Dann bekomme ich die richtige Antwort ('04') ....
Das hat mich umgehauen. Ich bin schon einen ganzen Tag dabei und kann nicht herausfinden, warum der Code alleine funktioniert, aber in einer CASE-Anweisung eingeschlossen schlägt fehl.
Bitte helfen Sie!
4 Antworten
Weil Ihre case-Anweisung denselben Datentyp zurückgeben muss und das else standardmäßig INT
ist. Es ist die Reihenfolge von Vorrang. Hier erhalten Sie eine implizite Konvertierung. Das Wirken von ELSE
würde dies beheben.
,CASE
WHEN len(month(getdate())) = 1
THEN right('0' + convert(varchar(2),month(getdate())),2)
ELSE
cast(month(getdate()) as varchar(2)) END
Sie können dies erreichen, indem Sie FORMAT:
SELECT FORMAT(MONTH(GETDATE()), '00')
Sie benötigen keine Fallbeschreibung. Unten funktioniert für alle Monate.
select right('0' + convert(varchar(2), month(getdate())), 2)
Wandle dein ELSE in einen Varchar (2) um und es funktioniert gut.
SELECT CASE WHEN len(month(getdate())) = 1
THEN right('0' + convert(varchar(2),month(getdate())),2)
else CONVERT(varchar(2), month(getdate()))
end