Sqlserver
 sql >> Datenbank >  >> RDS >> Sqlserver

Erstellen Sie mit T-SQL ein Datum aus Tag, Monat und Jahr

Versuchen Sie Folgendes:

Declare @DayOfMonth TinyInt Set @DayOfMonth = 13
Declare @Month TinyInt Set @Month = 6
Declare @Year Integer Set @Year = 2006
-- ------------------------------------
Select DateAdd(day, @DayOfMonth - 1, 
          DateAdd(month, @Month - 1, 
              DateAdd(Year, @Year-1900, 0)))

Es funktioniert auch, hat den zusätzlichen Vorteil, dass keine Zeichenfolgenkonvertierungen durchgeführt werden, es handelt sich also um eine reine arithmetische Verarbeitung (sehr schnell) und es ist nicht von einem Datumsformat abhängig Wert, dessen erster Teil eine Ganzzahl ist, die die Anzahl der Tage seit dem 1. Januar 1900 darstellt, und der zweite Teil ein Dezimalbruch ist, der den Bruchteil eines Tages (für die Zeit) darstellt --- Also der ganzzahlige Wert 0 (Null) übersetzt immer direkt in den Mitternachtsmorgen des 1. Januar 1900...

oder, dank des Vorschlags von @brinary,

Select DateAdd(yy, @Year-1900,  
       DateAdd(m,  @Month - 1, @DayOfMonth - 1)) 

Bearbeitet im Oktober 2014. Wie von @cade Roux angemerkt, hat SQL 2012 jetzt eine eingebaute Funktion:
DATEFROMPARTS(year, month, day)
das macht dasselbe.

Bearbeitet am 3. Okt. 2016, (Dank an @bambams für den Hinweis und @brinary für die Behebung), Die letzte Lösung, vorgeschlagen von @brinary. scheint für Schaltjahre nicht zu funktionieren, es sei denn, die Addition von Jahren wird zuerst durchgeführt

select dateadd(month, @Month - 1, 
     dateadd(year, @Year-1900, @DayOfMonth - 1));