una - obtener solo la fecha de un datetime en sql server
Fecha anterior del lunes y domingos anterior basada en la fecha de hoy (5)
Aún mejor, creo que esto funciona para cualquier fecha, cualquier día de la semana, con cualquier parámetro DateFirst (establecido el primer día de la semana, generalmente 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
Trabaja para SQL 2008, crea la función y usa:
SELECT dbo.previousWeekDayDate(GetDate(),1) --for Monday
SELECT dbo.previousWeekDayDate(GetDate(),7) --for Sunday
Necesito la sintaxis correcta para darme:
- Semanas anteriores: fecha del lunes basada en la fecha / hora actual usando
GETDATE()
- Semanas anteriores Fecha de domingos basada en la fecha / hora actual usando
GETDATE()
Entonces, según la fecha de hoy (14/09/2012) me gustaría lo siguiente:
- Fecha anterior del lunes = 09/09/2012
- Fecha de domingos anterior = 09/09/2012
Cabe señalar que el problema con los domingos parece que ya no está presente al menos a partir de MSSQL 2012. Tanto la solución simple
SELECT DATEADD(wk, DATEDIFF(wk, 6, @input), 0)
y el complejo
SELECT DATEADD(wk, DATEDIFF(wk, 6,
CASE DATEPART(dw,@input)
WHEN 1 THEN DATEADD(d,-1,@input)
ELSE @input
END
), 0)
Devuelva lo mismo para cualquier fecha que haya intentado, incluidos los domingos.
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 se puede usar así en una consulta del mundo real:
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'')
Aquí hay 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 fue en otro año.
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 límite superior en el mes actual
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. La 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
En lugar de usar una opción de caso, también puede hacer esto para obtener el domingo de la semana actual:
SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1+1, GETDATE())
Para obtener el domingo de la semana anterior, resta 7 días más:
SELECT DATEADD(dd, DATEPART(DW,GETDATE())*-1-6, GETDATE())
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 :
Lo de abajo manejará el tema 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)