SQL – Ändern von data

Was ist der beste path, um eine datesvariable in SQL zu nehmen und sie auf Anfang des Jahres und Ende des Jahres zu setzen?

declare @calcDate date = '7/7/2016' 

Wie bekomme ich '1/1/2016' und '12 / 31/2016 'mit @calcDate?

   
 DECLARE @calcDate date = '7/7/2016' SELECT DATEADD(yy, DATEDIFF(yy,0,@calcDate), 0) AS BeginningOfYear, DATEADD(yy, DATEDIFF(yy,0,@calcDate) + 1, -1) AS EndOfYear 

Ich würde nur datefromparts() :

 select datefromparts(year(@calcdate), 1, 1) as soy, datefromparts(year(@calcdate), 12, 31) as eoy 

Frühere Versionen von SQL server erfordern eine merkwürdige datesarithmetik. Diese function ist in SQL server 2012+ verfügbar (siehe hier ).

Scheint mir, dass es hier keine wirkliche "Berechnung" gibt, da der erste Tag des Jahres immer 1/1 ist und der letzte Tag immer 12/31 ist. Wir müssen diese nur an das betreffende Jahr anhängen:

 declare @calcDate date = '7/7/2016' select cast(cast(year(@calcDate) as varchar(4)) + '0101' as date) select cast(cast(year(@calcDate) as varchar(4)) + '1231' as date) 

Ergebnis:

 2016-01-01 2016-12-31 

year ist in SQL server 2008 und höher verfügbar.