2011-07-05 18 views
9

He intentado buscar una solución pero no he podido encontrarla.SQL Server Seleccione las últimas 4 semanas a partir de ahora y el mismo período del año pasado solamente

Necesito seleccionar las últimas 4 semanas de datos de la fecha de hoy, que no es el problema ya que solo hago un date >= Dateadd(mm, -1, getdate()). Sin embargo, también quiero las mismas 4 semanas de datos del año anterior. Pero no quiero (por ejemplo) del 1 al 30 de junio de 2010 y del 1 al 30 de junio de 2011, necesitaría

30 de junio (jueves) 2011 y 4 semanas antes Y el 1 de julio y cuatro semanas antes cuando el 1 de julio era jueves en la misma semana del año anterior.

por lo que se devolverán 8 semanas de datos.

¡Gracias por la ayuda!

+0

¿Qué lógica está usando para seleccionar '6/30/2011' en lugar de' 7/7/2011'? – JNK

+0

@JNK Es '7/1/2010' y si restan 52 semanas del' 30/30/2011' obtienes '7/1/2010'. – Fosco

Respuesta

15

Puede utilizar algunos más DATEADD() la bondad de volver al año anterior:

where theDate >= DATEADD(mm, -1, GETDATE())  
OR 
    (theDate <= DATEADD(week,-52,convert(datetime,GETDATE())) 
    and 
    theDate >= DATEADD(mm,-1,DATEADD(week,-52,convert(datetime,GETDATE())))) 

Restando 52 semanas a partir de 6/30/2011 7/1/2010 rendimientos requeridos como ... Luego, utilizando su sustracción original de 1 mes desde allí para el límite inferior.

También podría cambiar todo el asunto de usar semanas ...

where theDate >= DATEADD(week, -4, GETDATE())  
OR 
    (theDate <= DATEADD(week,-52,convert(datetime,GETDATE())) 
    and 
    theDate >= DATEADD(week,-56,convert(datetime,GETDATE()))) 
+0

+1 - Debe usar semanas en lugar de meses para mantener la coherencia. – JNK

+0

¿Qué sucede si quiero obtener las últimas 12 semanas en lugar de las 4 semanas? – Si8

+0

Luego use el segundo ejemplo, cambie -4 a -12, -56 a -64. – Fosco

0

puede hacer una serie de condiciones con OR ENTRE:

select 
    ... 
from 
    ... 
where 
    1=1 
    or date between Dateadd(mm, -2, getdate()) and Dateadd(mm, -1, getdate()) 
    or date between Dateadd(mm, -11, getdate()) and Dateadd(mm, -10, getdate()) 
order by 
    date 

¿He entendido bien?

+0

Esto no parece resolver el problema de la semana mencionado en la oferta, seleccionando 4 semanas hasta el 30/06/2011 y 4 semanas hasta el 1 de julio de 2010. – Fosco

Cuestiones relacionadas