sql >> Database teknologi >  >> RDS >> Sqlserver

Få en bestemt ugedag inden for en uge givet af en DATETIME

Med datetime-værdier skal du være meget forsigtig! Især indekset for en dag er vanskelig. Du bør altid tænke på kulturspecifikke forskelle:

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

--Jeg prøver det her med tysk kultur, det starter med mandag

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

--Nu det samme med engelsk kultur, startende på søndag

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

--Du kan få denne kultur uafhængig ved at tilføje disse værdier 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 returnerer begge forespørgsler den samme værdi for fredag, 6 .

Dit eksempel viser søndagen som den første dag i ugen, så søndagen i ugen til den givne dag burde faktisk være den 17. juli. Dit forventede output (24. juli) er den første dag i den følgende uge, ikke?

Prøv dette:

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. Hvordan nulstiller man postgres' primære nøglesekvens, når den falder ud af synkronisering?

  2. Returner den første mandag i hver måned i SQLite

  3. Hvordan tilføjer jeg en besked, der siger $user_id slettet eller $user_id ikke fundet?

  4. Aktiver ODP.Net-logning