Respuestas:
Lo siguiente agrega -1 años a la fecha actual:
SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())
Encontré esta página mientras buscaba una solución que me ayudara a seleccionar los resultados de un año calendario anterior. La mayoría de los resultados que se muestran arriba parecen devolver artículos de los últimos 365 días, lo que no funcionó para mí.
Al mismo tiempo, me dio suficiente dirección para resolver mis necesidades en el siguiente código, que estoy publicando aquí para cualquier otra persona que tenga la misma necesidad que la mía y que pueda encontrar esta página en busca de una solución.
SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate()))
Gracias a aquellos arriba cuyas soluciones me ayudaron a llegar a lo que necesitaba.
Bueno, creo que falta algo aquí. El usuario desea obtener datos del último año y no de los últimos 365 días. Hay una gran diferencia. En mi opinión, los datos del año pasado son todos los datos de 2007 (si estoy en 2008 ahora). Entonces la respuesta correcta sería:
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1
Luego, si desea restringir esta consulta, puede agregar algún otro filtro, pero siempre buscando en el último año.
SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE()) - 1 AND DATE > '05/05/2007'
El más legible, en mi opinión:
SELECT * FROM TABLE WHERE Date >
DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))
Cual:
Hay variantes con DATEDIFF y DATEADD para obtener la medianoche de hoy, pero tienden a ser bastante obtusas (aunque un poco mejor en el rendimiento, no es que lo notaría en comparación con las lecturas necesarias para obtener los datos).
GETDATE () devuelve la fecha y hora actuales .
Si el año pasado comienza a la medianoche del día actual del año pasado (como en el ejemplo original), debe usar algo como:
DECLARE @start datetime
SET @start = dbo.getdatewithouttime(DATEADD(year, -1, GETDATE())) -- cut time (hours, minutes, ect.) -- getdatewithouttime() function doesn't exist in MS SQL -- you have to write one
SELECT column1, column2, ..., columnN FROM table WHERE date >= @start
Las otras sugerencias son buenas si tiene "solo SQL".
Sin embargo, sugiero que, si es posible , calcule la fecha en su programa y la inserte como una cadena en la consulta SQL.
Al menos para tablas grandes (es decir, varios millones de filas, tal vez combinadas con uniones) que le brindarán una mejora considerable en la velocidad, ya que el optimizador puede trabajar con eso mucho mejor.
argumento para la función DATEADD:
DATEADD (*datepart* , *number* , *date* )
datepart puede ser: aa, qq, mm, dy, dd, wk, dw, hh, mi, ss, ms
número es una expresión que se puede resolver en un int que se agrega a una parte de fecha
fecha es una expresión que se puede resolver en un valor de hora, fecha, fecha y hora pequeña, fecha y hora, fecha y hora2 o fecha y hora.
declare @iMonth int
declare @sYear varchar(4)
declare @sMonth varchar(2)
set @iMonth = 0
while @iMonth > -12
begin
set @sYear = year(DATEADD(month,@iMonth,GETDATE()))
set @sMonth = right('0'+cast(month(DATEADD(month,@iMonth,GETDATE())) as varchar(2)),2)
select @sYear + @sMonth
set @iMonth = @iMonth - 1
end
Yo, como @DE White, vine aquí por razones similares pero diferentes a la pregunta original. La pregunta original se refiere a los últimos 365 días. La respuesta de @ samjudson proporciona eso. La respuesta de @DE White devuelve resultados para el año calendario anterior.
Mi consulta es un poco diferente ya que funciona para el año anterior hasta la fecha actual inclusive:
SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))
Por ejemplo, el 17 de febrero de 2017, esta consulta devuelve resultados del 1/1/2016 al 17/02/2017.
Tuve un problema similar, pero el codificador anterior solo proporcionó la fecha en formato mm-aaaa. Mi solución es simple pero podría resultar útil para algunos (también quería asegurarme de que se eliminaran los espacios de inicio y finalización):
SELECT ... FROM ....WHERE
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE())
Por alguna razón, ninguno de los resultados anteriores funcionó para mí.
Esto selecciona los últimos 365 días.
SELECT ... From ... WHERE date BETWEEN CURDATE() - INTERVAL 1 YEAR AND CURDATE()