2011-05-13 8 views
13

Estoy tratando de obtener el viernes más reciente en SQL Server 2008.Obtenga la fecha del viernes más reciente SQL

Tengo esto. Se inicia al principio de la semana (lunes) y luego resta 3 días para el viernes.

declare @recentFriday datetime = DATEADD(ww, DATEDIFF(dd,0,GETDATE()), 0)-3 

Cuando se ejecuta durante la semana, la fecha del último viernes es la correcta. Pero cuando se ejecuta el viernes (o el sábado), todavía recibe la fecha de la semana pasada en lugar del viernes de la semana actual. Estoy a punto de usar las condiciones if/else, pero estoy seguro de que hay una manera más fácil.

+0

posible duplicado de [Find último domingo] (http://stackoverflow.com/questions/1794697/find-last-sunday). Similar a la respuesta de Joe – gbn

Respuesta

12

Esto funciona para cualquier entrada y cualquier ajuste de DATEFIRST:

dateadd(d, -((datepart(weekday, getdate()) + 1 + @@DATEFIRST) % 7), getdate()) 

Se funciona ajustando el valor del día de la semana de modo que 0 = viernes, simulando el viernes como el comienzo de la semana. Luego resta el valor del día de la semana si no es cero para obtener el viernes más reciente.

Editar: Actualizado para funcionar para cualquier configuración de DATEFIRST.

+0

no estoy abajo, pero creo que fue el voto a favor antes de que edite su pregunta. – RRUZ

+0

@RRUZ: De hecho, el voto abajo ya no está allí. – mellamokb

+0

Hola @mellamokb, estoy intrigado por esta línea de código que has publicado. Tengo un escenario donde puedo tener que usarlo para que en un guión tenga que encontrar el jue más reciente o en otro el lunes más reciente. ¿Qué tengo que cambiar en tu código para tener ese nivel de flexibilidad? ¿Acabo de cambiar el "+1" por "+2" para recoger el jue más reciente, por ejemplo? ¿Cómo hace tu código Friday = 0? –

2

El uso de un viernes conocida (Voy utilice las teclas 7 Ene, 2011) como punto de partida, se puede hacer esto:

DECLARE @d DATETIME 

SET @d = '2011-05-13' /* Friday */ 
SELECT DATEADD(DAY, (DATEDIFF (DAY, '20110107', @d)/7) * 7, '20110107') 
/* Returns 2011-05-13 */ 

SET @d = '2011-05-12' /* Thursday */ 
SELECT DATEADD(DAY, (DATEDIFF (DAY, '20110107', @d)/7) * 7, '20110107') 
/* Returns 2011-05-06 */ 

simplemente selecciona un viernes sabido que es más viejo que cualquier fecha que usted será usando en tus cálculos.

4

se puede comprobar si el día actual de la semana es el viernes o mayor DATEPART(dw,GETDATE()) y luego llamar (SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)+4) o (SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)-3)

SELECT 
CASE WHEN DATEPART(dw,GETDATE()) >= 5 THEN 
(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)+4) 
ELSE 
(SELECT DATEADD(wk, DATEDIFF(wk,0,GETDATE()), 0)-3) 
END 
+0

Esto depende de la configuración '@@ DATEFIRST'. Si intento 'SET DATEFIRST 2', devuelve' 2011-05-06', 'SET DATEFIRST 1' devuelve' 2011-05-13' –

+0

@Martin, estoy de acuerdo con usted, pero el OP fácilmente puede agregar esa variable en el SQL propuesto. – RRUZ

0

Aquí es un completamente orientada conjunto manera de achive el último viernes:

select Friday from 
(
select max(GetDate()) as Friday where datepart(dw, getdate()) = 6 
union all 
select max((GetDate() - 1)) where datepart(dw, (getdate() - 1)) = 6 
union all 
select max((GetDate() - 2)) where datepart(dw, (getdate() - 2)) = 6 
union all 
select max((GetDate() - 3)) where datepart(dw, (getdate() - 3)) = 6 
union all 
select max((GetDate() - 4)) where datepart(dw, (getdate() - 4)) = 6 
union all 
select max((GetDate() - 5)) where datepart(dw, (getdate() - 5)) = 6 
) x where Friday is not null 
5
DECLARE @date DATETIME = '20110512' -- Thursday 
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110506 

SET @date = '20110513' -- Friday 
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110513 

SET @date = '20110514' -- Saturday 
SELECT DATEADD(DAY,-(DATEDIFF(DAY,'19000105',@date)%7),@date) --20110513 
  1. Calcular el número de días entre un viernes conocida (05 Ene 1900) y la fecha dada
  2. El resto para dividir la diferencia en 1. por 7 serán los días transcurridos desde el último viernes
  3. Resta el resto en 2. fro m la fecha dada
+0

Gracias por la explicación – James

1
SELECT CONVERT(VARCHAR(12),GETDATE()) AS Today, 
CASE WHEN (DATEPART(DW,GETDATE())< 7) 
THEN CONVERT(VARCHAR(12),(DATEADD(dd,-(DATEPART(DW,GETDATE())+1),GETDATE()))) 
ELSE CONVERT(VARCHAR(12),(DATEADD(d,- 1,GETDATE()))) 
END AS [Last Friday] 
Cuestiones relacionadas