sql >> Database >  >> RDS >> Sqlserver

Maak een datum van dag, maand en jaar met T-SQL

Probeer dit:

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)))

Het werkt ook, heeft als bijkomend voordeel dat het geen stringconversies doet, dus het is puur rekenkundige verwerking (zeer snel) en het is niet afhankelijk van een datumformaat. Dit profiteert van het feit dat de interne representatie van SQL Server voor datetime en smalldatetime-waarden een tweedelig is waarde waarvan het eerste deel een geheel getal is dat het aantal dagen sinds 1 jan 1900 vertegenwoordigt, en het tweede deel een decimale breuk is die het breukdeel van één dag (voor de tijd) vertegenwoordigt --- Dus de gehele waarde 0 (nul) vertaalt altijd direct naar middernacht van 1 jan 1900...

of, dankzij suggestie van @brinary,

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

Bewerkt oktober 2014. Zoals opgemerkt door @cade Roux, heeft SQL 2012 nu een ingebouwde functie:
DATEFROMPARTS(year, month, day)
dat doet hetzelfde.

Bewerkt op 3 oktober 2016, (met dank aan @bambams voor het opmerken hiervan, en @brinary voor het oplossen ervan), De laatste oplossing, voorgesteld door @brinary. lijkt niet te werken voor schrikkeljaren, tenzij eerst de jarentelling wordt uitgevoerd

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


  1. INT vs Unique-Identifier voor ID-veld in database

  2. Hoe te repareren "Server is niet geconfigureerd voor GEGEVENSTOEGANG" in SQL Server

  3. Voorbeelden van veel-op-veel relaties

  4. Oracle 11g krijgt alle overeenkomende voorvallen door een reguliere expressie