sql >> Databasteknik >  >> RDS >> Sqlserver

Få en viss veckodag inom en vecka givet av en DATETIME

Med datetime-värden måste du vara mycket försiktig! Särskilt indexet för en dag är knepigt. Du bör alltid tänka på kulturspecifika skillnader:

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

--Jag provar det här med tysk kultur, det här börjar med måndag

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

--Nu samma sak med engelsk kultur, med start på söndag

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

--Du kan få den här kulturen oberoende genom att lägga till dessa värden med 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

Nu returnerar båda frågorna samma värde för Friday, 6 .

Ditt exempel visar söndagen som första dagen i veckan, så söndagen i veckan till den givna dagen borde faktiskt vara den 17 juli. Din förväntade produktion (24 juli) är den första dagen i följande vecka, eller hur?

Prova detta:

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)



  1. MySQL tidszonsfråga

  2. Är TimeStamp-kolumnen unik?

  3. Vad behöver jag för att undvika när jag skickar en förfrågan?

  4. Hive-tabell returnerar tom resultatuppsättning för alla frågor