2009-06-18 9 views
5

Trabajo en una universidad y nuestra fecha de inicio del año académico de los sistemas de gestión estudiantil está determinada por el lunes el 1 de agosto o antes. Necesito hacer coincidir esto en mi consulta, ¿hay alguna manera de obtener fácilmente la fecha del lunes en esta fecha o antes?T-sql Lunes antes de la fecha

Respuesta

2
set datefirst 1; -- Make Monday the first day of the week 

select dateadd(dd, -1*(datepart(dw, '2009-08-01')-1), '2009-08-01') 

devoluciones de julio de 27o, 2009, que es el Lunes en o antes del 1 de agosto cambiarlo a 2005 cuando: 1 Ago era un lunes y la consulta devolverá 08-01

1

Puede usar datepart para obtener el día de la semana, y luego hacer un poco de matemáticas para volver a su lunes. Este ejemplo usa el valor predeterminado de los Estados Unidos de datefirst 7 (en el que el lunes es el día 2 de la semana). Ajuste los días para agregar para que sea el día de la semana del lunes para su localidad.

select dateadd(dd, -datepart(dw, '2009-08-01') + 2, '2009-08-01') 
+0

Lo he marcado porque lo siguiente arroja un resultado incorrecto: seleccione dateadd (dd, -datepart (dw, '2011-05-15') + 2, '2011 -05-15 '). Esto devuelve '2011-05-16'. –

0

poco limpia

DECLARE @weekday int 

SELECT @weekday = DATEPART(WEEKDAY, '1-Aug-2009') 

SELECT CASE 
WHEN @weekday = 1 THEN '1-Aug-2009' ELSE DATEADD (dd,(@weekday-2)*-1, '1-Aug-2009') 
END 
0

se trata de un algoritmo genérico que devolverá el primer lunes de cada mes (@inputdate):

DATEADD(wk, DATEDIFF(wk, 0, dateadd(dd, 6 - datepart(day, @inputDate), @inputDate)), 0) 

Es un método común para obtener el primer lunes del mes en SQL Server. Este link explica cómo funciona el cálculo anterior junto con muchos otros cálculos de fecha.

Aquí es cómo el algoritmo anterior se podría utilizar para obtener el Lunes en o antes del primero día de un mes:

-- Set month to get Monday before or at 1st of month. 
DECLARE @inputDate DATETIME 
SET @inputDate = '2009-08-01' 

-- Get first Monday of month. 
DECLARE @firstMonday DATETIME 
SET @firstMonday = DATEADD(wk, DATEDIFF(wk, 0, dateadd(dd, 6 - datepart(day, @inputDate), @inputDate)), 0) 

-- Determine date for first Monday on or before 1st of month. 
DECLARE @startDate DATETIME 
SET @startDate = @firstMonday 
IF @firstMonday > @inputDate 
    SET @startDate = DATEADD(wk, -1, @firstMonday) 

SELECT @startDate 
4

La respuesta aceptada no funcionó para mí porque necesitaba tanto una El domingo por la semana y el lunes por la semana en la misma consulta. Esto funciona a través de "DATEFIRST" ajustes diferentes:

SELECT DATEADD(d, -((DATEPART(WEEKDAY, '20110515') - DATEPART(dw, '19000101') + 7) % 7), '20110515') 

"(ps, '19000101') DATEPART" determinará su "datefirst" configuración desde 1900-01-01 fue un lunes. Si desea una semana basada en martes, puede cambiar 19000101 a 19000102.

BTW, '20110515' es el único formato de fecha que funciona en todas las configuraciones de cultivo de SQL Server. Fechas como '2011-05-06' serán malinterpretadas en ciertos países. (crédito a Itzik Ben-Gan por señalar esto)

+0

+1 para una solución agnóstica elegante, 'datefirst'. –

+0

Agradable, debería ser la respuesta aceptada – nhaberl

Cuestiones relacionadas