Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Uzyskaj określony dzień tygodnia w ciągu tygodnia podany przez DATETIME

Z wartościami datetime musisz być bardzo ostrożny! Szczególnie indeks dnia jest trudny. Zawsze powinieneś myśleć o różnicach specyficznych dla kultury:

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

--Próbuję tego z kulturą niemiecką, zaczyna się od poniedziałku

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

--Teraz to samo z kulturą angielską, począwszy od niedzieli

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

--Możesz uzyskać niezależność tej kultury, dodając te wartości za pomocą 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

Teraz oba zapytania zwracają tę samą wartość dla piątku, 6 .

Twój przykład pokazuje niedzielę jako pierwszy dzień tygodnia, więc niedziela tygodnia do danego dnia powinna być w rzeczywistości 17 lipca. Twój oczekiwany wynik (24 lipca) to pierwszy dzień następnego tygodnia, prawda?

Spróbuj tego:

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. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Znajdź nazwę tabeli we wszystkich obiektach wszystkich baz danych

  2. Wstaw znaki w środku ciągu w SQL Server (T-SQL)

  3. SQL Server wykonuje kopię zapasową za pomocą C#

  4. Jak dynamicznie tworzyć arkusze robocze za pomocą XSLT?

  5. Rekurencyjny SQL do podziału CSV na wiersze tabeli