[SQL] 1 jan 2005 = week 1 ?? ipv week 53 van vorige jaar

Pagina: 1
Acties:
  • 268 views sinds 30-01-2008
  • Reageer

  • shades
  • Registratie: September 2001
  • Laatst online: 06-03 10:48
Er draait bij ons een applicatie met heel veel storedprocs

Bij een aantal van die stored procs wordt verwacht een jaar en een weeknummer. De WHERE clause is alsvolgt:

SQL:
1
WHERE ( DATEPART(ww, DatumVeld) = @WeekNumber AND YEAR(DatumVeld) = @Year )


Er waren klachten dat de weken verschoven waren.

Even testje gedaan:
PRINT DATEPART(wk,'jan 1 2005') geeft week 1 ipv 53 (2004)
PRINT DATEPART(wk,'jan 3 2005') geeft week 1 ipv 53 (2004)
PRINT DATEPART(wk,'jan 8 2005') geeft week 2 ipv 1 (2005)
:? huh. Lijkt erop dat sql niet de ISO standaard aanhoud met week1 is eerste week met 4 dagen oid.

Hoe kan ik dit snel oplossen want het is heel verwarrend?

https://k1600gt.nl


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
SQL Server hanteert inderdaad niet de ISO standaard. Voor SQL Server is week 1 de week waarin 1 januari valt, dit is ook niet in te stellen.

De enige oplossing is een user defined fuction in plaats van de ingebouwde datepart functie.

code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
CREATE FUNCTION ISOweek  (@DATE datetime)
RETURNS int
AS
BEGIN
   DECLARE @ISOweek int
   SET @ISOweek= DATEPART(wk,@DATE)+1
      -DATEPART(wk,CAST(DATEPART(yy,@DATE) as CHAR(4))+'0104')
--Special cases: Jan 1-3 may belong to the previous year
   IF (@ISOweek=0) 
      SET @ISOweek=dbo.ISOweek(CAST(DATEPART(yy,@DATE)-1 
         AS CHAR(4))+'12'+ CAST(24+DATEPART(DAY,@DATE) AS CHAR(2)))+1
--Special case: Dec 29-31 may belong to the next year
   IF ((DATEPART(mm,@DATE)=12) AND 
      ((DATEPART(dd,@DATE)-DATEPART(dw,@DATE))>= 28))
      SET @ISOweek=1
   RETURN(@ISOweek)
END

Oops! Google Chrome could not find www.rijks%20museum.nl


  • shades
  • Registratie: September 2001
  • Laatst online: 06-03 10:48
P_de_B schreef op maandag 10 januari 2005 @ 10:44:
SQL Server hanteert inderdaad niet de ISO standaard. Voor SQL Server is week 1 de week waarin 1 januari valt, dit is ook niet in te stellen.

De enige oplossing is een user defined fuction in plaats van de ingebouwde datepart functie.
Bah.
Ik zie alleen even niet hoe ik via deze funtie de dagen van de die week/jaar krijg.. Dit is meer een conversie van de sqlweek naar isoweek (is wel wat er nodig is maar de andere kant op ?) De isoweek heb ik namelijk als invoer want die is wel correct maar sql2000 intepreteerd het dus niet juist

https://k1600gt.nl


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
Je kunt deze functie gebruiken in plaats van je DATEPART functie.


SELECT
FROM
WHERE dbo.fnISOWEEK( JouwDatumVeldje) = @Weeknummer

Oops! Google Chrome could not find www.rijks%20museum.nl


  • shades
  • Registratie: September 2001
  • Laatst online: 06-03 10:48
Ah
(Heb nog nooit met sql functions gewerkt dus ben even in de war) Maar dit is geweldig.
Doet deze functie veel inboeten op de performance of valt dat wel mee ?

https://k1600gt.nl


  • P_de_B
  • Registratie: Juli 2003
  • Niet online
shades schreef op maandag 10 januari 2005 @ 11:34:
Ah
(Heb nog nooit met sql functions gewerkt dus ben even in de war) Maar dit is geweldig.
Doet deze functie veel inboeten op de performance of valt dat wel mee ?
Ik gok zo dat het wel meevalt :) Je zou natuurlijk even met de QueryAnalyzer naar het execution plan kunnen kijken.

Oops! Google Chrome could not find www.rijks%20museum.nl


  • shades
  • Registratie: September 2001
  • Laatst online: 06-03 10:48
Super !

Execution plan heeft 1 extra item (cost 0%)

https://k1600gt.nl

Pagina: 1