sql >> Base de Datos >  >> RDS >> Sqlserver

¿Cómo obtener la primera y última fecha del año actual?

SELECT
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()), 0) AS StartOfYear,
   DATEADD(yy, DATEDIFF(yy, 0, GETDATE()) + 1, -1) AS EndOfYear

La consulta anterior proporciona un valor de fecha y hora para la medianoche a principios del 31 de diciembre. Esto es aproximadamente 24 horas antes del último momento del año. Si desea incluir el tiempo que podría ocurrir el 31 de diciembre, debe compararlo con el primero del próximo año, con un < comparación. O puede comparar con los últimos milisegundos del año actual, pero esto aún deja un espacio si está usando algo que no sea 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

Otros períodos

Este enfoque tiene dos aspectos agradables:buen rendimiento y se puede cambiar fácilmente para otros períodos reemplazando ambas apariciones de yy (=año) con una cadena diferente:

yy, yyyy    year
qq, q       quarter
mm, m       month
wk, ww      week 

(Tenga cuidado con las semanas:el día de inicio depende de la configuración del servidor).

Detalles técnicos

Esto funciona calculando el número de años desde 1900 con DATEDIFF(yy, 0, GETDATE()) y luego agregar eso a una fecha de cero =1 de enero de 1900. Esto se puede cambiar para que funcione para una fecha arbitraria reemplazando GETDATE() porción o un año arbitrario reemplazando DATEDIFF(...) función con "Año - 1900".

 SELECT
   DATEADD(yy, DATEDIFF(yy, 0, '20150301'), 0) AS StartOfYearForMarch2015,
   DATEADD(yy, 2015 - 1900, 0) AS StartOfYearFor2015