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

Isoweek w SQL Server 2005

Tutaj znajduje się link do innych wcześniejszych prób http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510

To jest STARY kod funkcji

CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN
DECLARE @rv int

SELECT @rv = datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)
FROM (SELECT dateadd(ww, datediff(day, 0, @date)/7, 3) day4) a

RETURN @rv
END

Po połączeniu genialnej odpowiedzi @AndriyM z moją własną, jesteśmy w jednej linii. To jest NOWY kod.

CREATE function f_isoweek(@date datetime)
RETURNS INT
as
BEGIN

RETURN (datepart(DY, datediff(d, 0, @date) / 7 * 7 + 3)+6) / 7
-- replaced code for yet another improvement.
--RETURN (datepart(DY, dateadd(ww, datediff(d, 0, @date) / 7, 3))+6) / 7

END

Wyjaśnienie dla starego kodu (nie będę wyjaśniał nowego kodu. To fragmenty z mojego kodu i kodu AndriyM):

Znalezienie 4 dnia tygodnia wybranej daty

dateadd(week, datediff(day, 0, @date)/7, 3) 

Znajdowanie izoroku - rok dnia tygodnia 4 tygodnia jest zawsze tym samym rokiem, co izorok tego tygodnia

datediff(yy, 0, day4)

Po dodaniu 3 dni do pierwszego dnia izoroku zostanie znaleziony losowy dzień pierwszego izotygodnia izoroku

dateadd(yy, datediff(yy, 0, day4),3)

znalezienie względnego tygodnia pierwszego izotygodnia izoroku

datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7

Znalezienie poniedziałku minus 4 dni pierwszego izotygodnia daje wynik czwartku tygodnia PRZED pierwszym dniem pierwszego izotygodnia izoroku

dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4)

Znajomość pierwszego czwartku tygodnia przed pierwszym tygodniem i pierwszym czwartkiem wybranego tygodnia sprawia, że ​​obliczenie tygodnia jest dość łatwe, nie ma znaczenia, jakie ustawienie ma pierwsza data, ponieważ dni powszednie obu dat to czwartki.

datediff(ww, dateadd(ww, datediff(d, 0, dateadd(yy, datediff(yy, 0, day4),3))/7,-4),day4)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kiedy powinienem użyć CROSS APPLY zamiast INNER JOIN?

  2. Problemy z synchronizacją bazy danych SQL Server

  3. Pętla T-SQL przez kolumnę danych XML w celu uzyskania unikalnego zestawu ścieżek

  4. Napraw komunikat 241 „Konwersja nie powiodła się podczas konwersji daty i/lub czasu z ciągu znaków” w SQL Server

  5. Dynamiczny WYBIERZ TOP @var w SQL Server