sql >> Base de Datos >  >> RDS >> Sqlserver

Obtenga cierto día de la semana dentro de una semana dada por DATETIME

¡Con los valores de fecha y hora debes tener mucho cuidado! Especialmente el índice de un día es complicado. Siempre debe pensar en las diferencias culturales específicas:

--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};

--Intento esto con la cultura alemana, esto comienza con el lunes

SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day

--Ahora lo mismo con la cultura inglesa, a partir del domingo

SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day

--Puede obtener esta cultura independiente agregando esos valores con Modulo 7

SET LANGUAGE GERMAN;
SELECT (@@DATEFIRST + DATEPART(WEEKDAY,@testDate)) % 7; --in Germany the Friday was 5th day

SET LANGUAGE ENGLISH;
SELECT (@@DATEFIRST + DATEPART(WEEKDAY,@testDate)) % 7; --in English culture this is the 6th day

Ahora ambas consultas devuelven el mismo valor para el viernes, el 6 .

Su ejemplo muestra el domingo como el primer día de la semana, por lo que el domingo de la semana del día dado debería ser el 17 de julio en realidad. Su salida esperada (24 de julio) es el primer día de la semana siguiente, ¿no es así?

Prueba esto:

DECLARE @DayOfWeek TINYINT = 1;
DECLARE @Date DATETIME = '2016-07-21 23:47:11.133';
SELECT CAST(@Date + @DayOfWeek - (@@DATEFIRST + DATEPART(WEEKDAY,@Date)) % 7 AS DATE)