SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear
A consulta acima fornece um valor de data e hora para meia-noite no início de 31 de dezembro. Isso é cerca de 24 horas antes do último momento do ano. Se você quiser incluir o tempo que pode ocorrer em 31 de dezembro, compare com o primeiro do próximo ano, com um
<
comparação. Ou você pode comparar com os últimos milissegundos do ano atual, mas isso ainda deixa uma lacuna se você estiver usando algo diferente de DATETIME (como DATETIME2):SELECT
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS LastDayOfYear,
DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0) AS FirstOfNextYear,
DATEADD(ms, -3, DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, 0)) AS LastTimeOfYear
Outros Períodos
Essa abordagem tem dois aspectos interessantes:bom desempenho e pode ser facilmente alterada para outros períodos substituindo ambas as ocorrências de
yy
(=ano) com uma string diferente:yy, yyyy year
qq, q quarter
mm, m month
wk, ww week
(Cuidado com as semanas:o dia de início depende das configurações do servidor.)
Detalhes técnicos
Isso funciona descobrindo o número de anos desde 1900 com
DATEDIFF(yy, 0, GETDATE())
e, em seguida, adicionando isso a uma data de zero =1º de janeiro de 1900. Isso pode ser alterado para funcionar para uma data arbitrária substituindo o GETDATE()
parte ou um ano arbitrário substituindo o DATEDIFF(...)
função com "Ano - 1900." SELECT
DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015