SQL Server: obtenga datos solo del año pasado


98

Estoy escribiendo una consulta en la que tengo que obtener los datos solo del último año. ¿Cuál es la mejor manera de hacer esto?

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'

Respuestas:


196

Lo siguiente agrega -1 años a la fecha actual:

SELECT ... From ... WHERE date > DATEADD(year,-1,GETDATE())

1
El suyo es más limpio, pero esto es lo que tenía: AÑO (GETDATE ()) - 1
PCPGMR

2
Eso le devuelve un número, no una fecha, luego no podría comparar eso con una fecha, sin también calcular el año de esa fecha. Esto luego devolvería resultados incorrectos para el 31 de diciembre de 2014 frente al 1 de enero de 2015, que están en años diferentes, pero no con un año de diferencia ...
samjudson

correcto. Necesitaba comparar años por número de año, por lo que de 2013 a 2014, por ejemplo, ya que los datos que ingresaban solo tenían el año. No estaba claro en mi comentario. Gracias
PCPGMR

Recibí un mensaje de error al ejecutar esta consulta ... "FUNCTION DatabaseName.DATEADD no existe" ¿Alguna sugerencia?
Marcello Perri

10

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.


7

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'

Esto tendrá un rendimiento muy malo en tablas grandes, su consulta recorrerá cada registro para evaluar el valor de año de la fecha, sería mejor usar un rango de fechas
Adriaan Davel


4

El más legible, en mi opinión:

SELECT * FROM TABLE WHERE Date >
   DATEADD(yy, -1, CONVERT(datetime, CONVERT(varchar, GETDATE(), 101)))

Cual:

  1. Obtiene la fecha y hora actual GETDATE () = # 27/8/2008 10:23 am#
  2. Convierte a una cadena con formato 101 CONVERT (varchar, # 8/27/2008 10:23 am#, 101) = '8/27/2007'
  3. Convierte a una fecha y hora CONVERT (datetime, '8/27/2007') = # 8/27/2008 12:00 AM#
  4. Resta 1 año DATEADD (aa, -1, # 27/8/2008 12:00 AM#) = # 27/8/2007 12:00 AM#

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).


2

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

0

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.


2
Sería mejor si crea una cadena parametrizada y evita colocar el valor en la cadena en sí ...
Adriaan Davel

0

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.


0
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

1
Esto no resuelve la pregunta.
Nathan Skerl

Además, los bucles while son generalmente malos para SQL
StingyJack

0

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.


0

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())

0

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()

Sería bueno si pudiera agregar la versión del servidor MSSQL para el que esto funciona.
era el
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.