Sqlserver
 sql >> Base de Dados >  >> RDS >> Sqlserver

Obter determinado dia da semana dentro de uma semana dada por um DATETIME


Com valores de data e hora, você deve ter muito cuidado! Especialmente o índice de um dia é complicado. Você deve sempre pensar nas diferenças específicas da cultura:
--The first of January was a Friday in 2016
DECLARE @testDate DATE = {d'2016-01-01'};

--Eu tento isso com a cultura alemã, isso começa com segunda-feira
SET LANGUAGE GERMAN;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in Germany the Friday was 5th day

--Agora o mesmo com a cultura inglesa, começando no domingo
SET LANGUAGE ENGLISH;
SELECT @@DATEFIRST,DATEPART(WEEKDAY,@testDate); --in English culture this is the 6th day

--Você pode obter essa cultura independente adicionando esses valores com o Módulo 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

Agora ambas as consultas retornam o mesmo valor para sexta-feira, o 6 .

Seu exemplo mostra o domingo como o primeiro dia da semana, portanto, o domingo da semana para o dia especificado deve ser 17 de julho, na verdade. Sua saída esperada (24 de julho) é o primeiro dia da semana seguinte, não é?

Tente isto:
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)