Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Isoweek в SQL Server 2005

Тук има връзка за други по-ранни опити http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510

Това е СТАРИЯ код за функцията

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

След като комбинирам брилянтния отговор на @AndriyM с моя собствен, оставаме до 1 ред. Това е НОВИЯ код.

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

Обяснение за стария код (няма да обяснявам новия код. Това са фрагменти от моя код и кода на AndriyM):

Намиране на ден от седмицата 4 от избраната дата

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

Намиране на изогодина - година от делничен ден 4 от седмицата винаги е същата година като изогодината на тази седмица

datediff(yy, 0, day4)

При добавяне на 3 дни към първия ден на изогодината се намира случаен ден от първата изоседмица на изогодината

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

намиране на относителна седмица от първата изоседмица на изогодината

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

Намирането на понеделник минус 4 дни от първата изоседмица води до четвъртък от седмицата ПРЕДИ първия ден от първата изоседмица на изогодината

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

Познаването на първия четвъртък от седмицата преди първата изоседмица и първия четвъртък от избраната седмица улеснява изчисляването на седмицата, няма значение коя дата на настройка е първата, тъй като работните дни и на двете дати са четвъртъци.

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. Как да получите номера на седмицата на месеца от датата в sql сървър 2008

  2. Низ за FTP връзка, използващ израз в SSIS

  3. Може ли SQL тригер да извика уеб услуга?

  4. Период от време, попадащ между две дати в LINQ заявка

  5. SQL рекурсивна заявка, която получава всички предшественици на елемент