Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Como obter a primeira e a última data do ano atual?

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