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

Isoweek i SQL Server 2005

Der er et link her til andre tidligere forsøg http://www.sqlteam. com/forums/topic.asp?TOPIC_ID=60510

Dette er den GAMLE kode for funktionen

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

Efter at have kombineret @AndriyM's geniale svar med mit eget, er vi nede på 1 linje. Dette er den NYE kode.

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

Forklaring på den gamle kode (vil ikke forklare den nye kode. Det er fragmenter fra min kode og AndriyMs kode):

Find ugedag 4 på den valgte dato

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

Find isoår - år på ugedag 4 af en uge er altid det samme år som isoår i den uge

datediff(yy, 0, day4)

Når der lægges 3 dage til den første dag i isoåret findes en tilfældig dag i den første isouge i isoåret

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

finde relativ uge af den første isouge i isoåret

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

At finde mandag minus 4 dage i den første isouge resulterer i torsdag i ugen FØR den første dag i den første isouge i isoåret

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

At kende den første torsdag i ugen før den første isouge og den første torsdag i den valgte uge, gør det ret nemt at beregne ugen, det er ligegyldigt, hvilken indstilling dato først har, da ugedagene for begge datoer er torsdage.

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


  1. Hvordan kan jeg indsætte store filer i MySQL db ved hjælp af PHP?

  2. Hvorfor har self.object i en CreateView ikke et id efter at have gemt i databasen?

  3. Installer Apache, MySQL 8 eller MariaDB 10 og PHP 7 på CentOS 7

  4. Find det seneste dubletter-ID med MySQL