Pregunta

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

SELECT ... FROM ... WHERE date > '8/27/2007 12:00:00 AM'
¿Fue útil?

Solución

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

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

Otros consejos

Encontré esta página mientras buscaba una solución que me ayudara a seleccionar resultados de un año calendario anterior.La mayoría de los resultados que se muestran arriba parecen ser artículos devueltos 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 publico 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 los anteriores cuyas soluciones me ayudaron a llegar a lo que necesitaba.

Bueno, creo que aquí falta algo.El usuario quiere obtener datos del último año y no de los últimos 365 días.Hay una diferencia enorme.En mi opinión, los datos del último año 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 quieres restringir esta consulta, puedes añadir 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'

Buscar dateadd en BOL

dateadd(yy,-1,getdate())

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() = #8/27/2008 10:23 a.m.#
  2. Se convierte a una cadena con formato 101 CONVERTIR(varchar, #27/8/2008 10:23 am#, 101) = '27/8/2007'
  3. Se convierte en una fecha y hora CONVERTIR(fechahora, '27/8/2007') = #27/8/2008 12:00 a.m.#
  4. Resta 1 año FECHAADD(aa, -1, # 27/8/2008 12:00 a. m. #) = # 27/8/2007 12:00 a. m. #

Hay variantes con DATEDIFF y DATEADD para obtener la medianoche de hoy, pero tienden a ser bastante obtusas (aunque ligeramente mejores en rendimiento, no es que lo notes en comparación con las lecturas necesarias para recuperar los datos).

GETDATE() devuelve la fecha actual y tiempo.

Si el año pasado comienza en 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 - calcula la fecha en su programa y la inserta como cadena en la consulta SQL.

Al menos para mesas grandes (es decir,varios millones de filas, tal vez combinadas con uniones) que le brindarán una mejora considerable de la velocidad, ya que el optimizador puede trabajar con eso mucho mejor.

argumento para la función DATEADD:

DATEADD (*datepart* , *number* , *date* )

parte de fecha puede ser:yy, qq, mm, dy, dd, semana, 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 de fecha

fecha es una expresión que se puede resolver en un valor de hora, fecha, fechahora pequeña, fechahora, fechahora2 o valor de desplazamiento de fechahora.

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

A mí me gusta @D.E.White, vino 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.@DELAWARE.La respuesta de White arroja resultados del año calendario anterior.

Mi consulta es un poco diferente porque 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 proporcionaba 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 iniciales y finales):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'-
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >=  DATEADD(year,-1,GETDATE())
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top