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!

1
Oday Salim 18 Apr. 2018 im 21:27

4 Antworten

Beste Antwort

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
6
scsimon 18 Apr. 2018 im 19:17

Sie können dies erreichen, indem Sie FORMAT:

SELECT FORMAT(MONTH(GETDATE()), '00') 
3
Vitali 18 Apr. 2018 im 18:47

Sie benötigen keine Fallbeschreibung. Unten funktioniert für alle Monate.

select right('0' + convert(varchar(2), month(getdate())), 2)
2
paparazzo 19 Apr. 2018 im 08:22

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
1
dfundako 18 Apr. 2018 im 18:33