2012-09-14 23 views
17

necesito la sintaxis correcta para darme:Anterior fecha lunes y anteriores domingos basado en Fecha de hoy

  1. anteriores semanas fecha lunes sobre la base de la fecha/hora actual usando GETDATE()
  2. semanas anteriores fecha domingos basado en la fecha/hora actual usando GETDATE()

por lo tanto, en base a la fecha de hoy (14/09/2012) yo querría lo siguiente:

  1. Anterior fecha lunes = 03/09/2012
  2. Anterior domingos fecha = 09/09/2012
+1

¿No fue el último lunes 10? ¿Estás buscando el lunes de la semana anterior? –

+0

¿Por qué su último lunes no fue '10/09/2012'? –

+0

Disculpa, estaba clasificando eso como este lunes (en la semana actual) así que sí, las semanas anteriores el lunes sería un mejor turno de frase – JsonStatham

Respuesta

31

Fácil:

--start of last week 
SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 0) 

--end of last week 
SELECT DATEADD(wk, DATEDIFF(wk, 6, GETDATE()), 6) 

EDITAR:

El más adelante se manejar el problema de la fecha del domingo.

DECLARE @input varchar(10) 
--SET @input = '9/9/2012' -- simulates a Sunday 
SET @input = GETDATE() 

--start of last week 
SELECT DATEADD(wk, DATEDIFF(wk, 6, 
CASE DATEPART(dw,@input) 
WHEN 1 THEN DATEADD(d,-1,@input) 
ELSE @input 
END 
), 0) 

--end of last week 
SELECT DATEADD(wk, DATEDIFF(wk, 6, 
CASE DATEPART(dw,@input) 
WHEN 1 THEN DATEADD(d,-1,@input) 
ELSE @input 
END 
), 6) 
+0

Esto se debe al mismo error que @Nikola Markovinović menciona más arriba. –

+0

+1 para incorporar el desplazamiento del día en el cálculo base. –

+0

Agregó el código según @Nikola Markovinović sugirió la corrección en el comentario anterior. –

8

En lugar de utilizar una opción caso, también se puede hacer esto para conseguir Domingo de la semana en curso:

SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1+1, GETDATE()) 

Para obtener Domingo de la semana anterior, restar 7 días más:

SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1-6, GETDATE()) 
+0

if @@ datefirst = 7 (predeterminado) el primero me da el domingo anterior (a menos que cuente la semana que comienza en domingo ... entonces está bien, pero entonces la opción de todo el caso también está fuera de duda. – robotik

3

Creo que esta es una solución mucho más limpia:

SELECT 
    -- 17530101 or 1753-01-01 is the minimum date in SQL Server 
    DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE())/7) * 7) - 7, '17530101') AS [LowerLimit], -- Last Week's Monday 
    DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE())/7) * 7) - 1, '17530101') AS [UpperLimit] -- Last Week's Sunday. 

que puede ser utilizado como esto en una verdadera consulta mundo:

SELECT 
    * 
FROM 
    SomeTable 
WHERE 
    SomeTable.[Date] >= DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE())/7) * 7) - 7, '17530101') AND 
    SomeTable.[Date] <= DATEADD(dd, ((DATEDIFF(dd, '17530101', GETDATE())/7) * 7) - 1, '17530101') 

Estas son algunas pruebas:

1. año bisiesto

Fecha actual: 2016-02-29 00:00:00.000

Resultados:

LowerLimit     UpperLimit 
2016-02-22 00:00:00.000 2016-02-28 00:00:00.000 

2. La semana pasada estaba en años diferentes

Fecha actual: 2016-01-06 00:00:00.000

LowerLimit     UpperLimit 
2015-12-28 00:00:00.000 2016-01-03 00:00:00.000 

3. Límite inferior en el mes anterior y un límite superior en el mes en curso

Fecha actual: 2016-05-04 00:00:00.000

LowerLimit     UpperLimit 
2016-04-25 00:00:00.000 2016-05-01 00:00:00.000 

4.Fecha actual es el domingo

Fecha actual: 2016-05-08 00:00:00.000

LowerLimit     UpperLimit 
2016-04-25 00:00:00.000 2016-05-01 00:00:00.000 
+1

Este es el solución que funciona con la menor manipulación, hasta donde yo sé (aunque el límite inferior muestra el lunes de la semana anterior, en lugar del lunes de la semana actual que solicita el OP). Otras soluciones sufren el "problema dominical" – Gallus

2

Aún mejor, creo, esto funciona para cualquier fecha, cualquier día de la semana, con cualquier parámetro DATEFIRST (establecer el primer día de la semana, por lo general 1-lunes en Francia, el valor predeterminado es 7-domingo).

create function [dbo].[previousWeekDayDate](@anyDate date, @anyWeekDay int) 
returns Date 
as 
begin 
    return DATEADD(dd, ((DATEPART(dw,@anyDate) + @@DateFirst - @anyWeekDay + 13) % 7) * -1, @anyDate) 
end 

obras para SQL 2008, crear la función y uso:

SELECT dbo.previousWeekDayDate(GetDate(),1) --for Monday 
SELECT dbo.previousWeekDayDate(GetDate(),7) --for Sunday 
+0

por qué +13 aunque? +6 o -1 es más limpio y más corto y funciona igual de bien. De todos modos, es genial que haya incorporado @@ datefirst en la equasion – robotik

0

Cabe señalar que el problema con los domingos parece estar presente ya no es por lo menos tan de MSSQL 2012. Tanto el sencillo solución

SELECT DATEADD(wk, DATEDIFF(wk, 6, @input), 0) 

y el complejo uno

SELECT DATEADD(wk, DATEDIFF(wk, 6, 
CASE DATEPART(dw,@input) 
WHEN 1 THEN DATEADD(d,-1,@input) 
ELSE @input 
END 
), 0) 

devolver el mismo para cualquier fecha que he intentado, incluidos los domingos.

Cuestiones relacionadas