2008-08-27 12 views

Respuesta

145

A continuación se añade -1 año a la fecha actual:

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

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

+0

Eso le devuelve un número, no una fecha, entonces no podría comparar eso con una fecha, sin calcular también el año de esa fecha. Esto entonces devolver resultados incorrectos para el 31 Dic 2014 vs 1 Ene el año 2015 - que están en diferentes años, pero no un año de diferencia ... – samjudson

+0

correcta. Necesitaba comparar el número de años por año, por lo que de 2013 a 2014, por ejemplo, ya que los datos que ingresaron solo tuvieron el año. No estaba claro en mi comentario. Gracias – PCPGMR

1

Mirar hacia arriba dateadd en BOL

dateadd(yy,-1,getdate()) 
1

GETDATE() devuelve la fecha actual y la hora .

Si año pasado comienza en la medianoche del día actual año pasado (como en el ejemplo inicial) se debe utilizar 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 
2

Bueno, creo que algo falta 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 último año son todos los datos de 2007 (si estoy en 2008 ahora). Así que la respuesta correcta sería:

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE) - 1 

Entonces, si desea restringir esta consulta, se puede añadir un poco de otro filtro, pero siempre buscando en el último año

SELECT ... FROM ... WHERE YEAR(DATE) = YEAR(GETDATE) - 1 AND DATE > '05/05/2007' 
+0

Esto tendrá muy mal rendimiento en grandes mesas, se consulta bucle voluntad sobre todos los registros para evaluar el valor del año de la fecha, sería mejor utilizar un intervalo de fechas –

2

la más legible, OMI :

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

Qué:

  1. Obtiene ahora es de fecha y hora GETDATE() = # 8/27/2008 10:23 am#
  2. se convierte en una cadena con formato de 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 (yy, -1, # 8/27/2008 12:00 AM#) = # 8/27/2007 12:00 AM#

Hay variantes con DATEDIFF y DATEADD para darle la medianoche del día de hoy, pero tienden a ser bastante obtusos (aunque un poco mejor en cuanto al rendimiento; no es que lo note en comparación con las lecturas necesarias para recuperar los datos).

0

Las otras sugerencias son buenas si tiene "solo SQL".

Sin embargo, sugiero, que - si es posible - calcule la fecha en su programa e insértela como cadena en la consulta SQL.

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

+2

Sería mejor si se crea una cadena parametrizado y evitar colocar el valor en la propia cadena ... –

0

argumento para la función DATEADD:

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

datepart puede ser: yy, qq, mm, dy, dd, sem, dw, hh, mi, ss, ms

número es una expresión que se puede resolver en un int que se agrega a una fecha de fecha

fecha es una expresión que se puede resolver a una hora, fecha, smalldatetime, datetime, datetime2 o datetimeoffset value.

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 aborda la cuestión. –

+0

Además, aunque los bucles generalmente son incorrectos para SQL – StingyJack

8

Esta página es en la búsqueda de una solución que ayude a seleccionar los resultados de un año calendario anterior. La mayoría de los resultados que se muestran arriba parecen devolver elementos 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 la búsqueda de una solución.

SELECT .... FROM .... WHERE year(*your date column*) = year(DATEADD(year,-1,getdate())) 

Gracias a los de arriba cuyas soluciones me ayudaron a llegar a lo que necesitaba.

-2

DONDE fecha> DATE_SUB (NOW(), el intervalo de 1 AÑO)

Esto le dará una consulta que se tire de 1 año de datos cada vez que lo ejecute.

+1

, la pregunta es para Microsoft SQL Server que no utiliza la función 'date_sub' ni la construcción' interval'. – jpw

0

I, como @ D.E.. White, vino aquí por razones similares pero diferentes a la pregunta original. La pregunta original pregunta por los últimos 365 días. La respuesta de @ samjudson lo proporciona. @DELAWARE. La respuesta de White arroja resultados para el año calendario anterior.

Mi consulta es un poco diferente, ya que trabaja para el año anterior hasta e incluyendo la fecha actual:

SELECT .... FROM .... WHERE year(date) > year(DATEADD(year, -2, GETDATE()))

Por ejemplo, el 17 feb, 2017 Esta consulta devuelve los resultados de 01/01/2016 hasta 02/17/2017

0

que tenía un problema similar, pero el codificador anterior sólo se proporciona la fecha en formato mm-aaaa. Mi solución es simple, pero podría resultar útil para algunos (yo también quería estar seguro de principio y se eliminaron los espacios que terminan):

SELECT ... FROM ....WHERE 
CONVERT(datetime,REPLACE(LEFT(LTRIM([MoYr]),2),'- 
','')+'/01/'+RIGHT(RTRIM([MoYr]),4)) >= DATEADD(year,-1,GETDATE()) 
Cuestiones relacionadas