fn_ISOweek liefert unterschiedliche Werte

daHartl

Benutzer
Beiträge
7
Hallo zusammen,

ich hab hier eine Funktion (fn_ISOweek)
die die ISO-Woche zu einem Datum ausgibt.

Interessant ist nur dass:

setlanguage english

select DataManagementV2.dbo.fn_ISOweek('2015-05-25')
- KW 21 ausgibt

setlanguage deutsch
select DataManagementV2.dbo.fn_ISOweek('25-05-2015')
- die richtige KW22

Ausgeführt auf nen SQL Server 2005 Express DE:

Code:
CODE der fn_ISOWeek:
-----------------------------------
set ANSI_NULLS ON
set QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[fn_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' )
--Jan 1-3 may belong to the previous year
IF ( @ISOweek = 0 )
BEGIN
DECLARE @Date2 datetime
SET @DATE2 = CAST( DATEPART( yy, @DATE ) - 1 AS CHAR(4) ) +
'12' + CAST( 24 + DATEPART( DAY, @DATE ) AS CHAR(2) )
-- rekursiver Aufruf:
EXEC @ISOWeek = ISOWeek @DATE2
SET @ISOWeek = @ISOWeek + 1
END
--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

Kann mir jemand sagen warum das so ist?

Vielen Dank im Voraus für Eure Hilfe!

da Hartl
 
Zuletzt bearbeitet von einem Moderator:
Werbung:
Eine einfache Frage...
Code:
DATEPART(ISO_WEEK, '3/26/13')
Das tuts nicht?

Code formatierung über den [ CODE]-Tag oder der dritte Button rechts von den Smileys in der Formatleiste[/CODE]
 
Code:
DATEPART(ISO_WEEK, '3/26/13')

tut leider nichts... ist ein SQL-Server 2005 Express :-(

PS: Danke für den Link für die Formatierung
 
Hab zwar jetzt einen Workaround gefunden, aber mich würde interessieren, warum sich die Funktion unter englisch anders verhält ;-)

Code:
DECLARE @StatusDate datetime;

set language english
set @StatusDate = '2015-05-25'
Print @StatusDate
print Database.dbo.fn_ISOweek(@StatusDate)

set language deutsch
set @StatusDate = CONVERT(VARCHAR(10), @StatusDate, 104)
Print @StatusDate
print Database.dbo.fn_ISOweek(@StatusDate)

da Hartl
 
Guten Morgen Tommi,

vielen Dank für den Hinweis,
Normalerweise ist es doch so, dass z.B. bei US der Sonntag der erste Tag in der Woche ist und bei DE der Montag.
Bei einem Sonntag könnte ich es nun verstehen, aber hier ist es ein Montag, der wäre doch immer in der gleichen Woche.

Witziger Weise ist das auch so bei einem Dienstag. z. dem 27.1.2015
Code:
set language english
select Database.dbo.fn_ISOweek('2015-01-27')
set language deutsch
select Database.dbo.fn_ISOweek('27-01-2015')

hier kommt eben auch english = 4 bzw. deutsch = 5 raus...
:-(
da Hartl
 
ahhh... ich glaub ich steh total auf dem Schlauch :-(-

Warum ist nun der 27.1.2015 welcher ein Dienstag war nun in english in KW4 und in deusch in KW 5?

Sorry, aber ich versteh es nicht :-(

Vielen Dank für die Geduld ;-)
 
Das Schöne an Standards ist für mich immer, daß es so viele verschiedene gibt. Such Dir eine passende Berechnungsfunktion bei Wikipedia raus und sei glücklich ;-)
 
Hallo Hartl,

in der von dir benutzten Funktion wird im ersten SET-Befehl die KW des übergebenen Datums ermitteln, um 1 inkrementiert und dann - jetzt kommts - wird die KW vom 04. Januar des Jahr, das aus dem übergebenen Datum ermittelt wird, abgezogen.

In 2015 fällt dieser Tag auf einen Montag. Daher wird in englischer Sprache die KW 2, in deutscher Sprache die KW 1 für den 04.01. ermittelt.

Das erklärt die Abweichung in deiner Funktion.

Viele Grüße,
Tommi
 
Vielen Dank Tommi für die Erklärung!
Das ist genau das, warum ich mich an das Forum gewandt hab!!!
Verstanden :D

PS: @akretschmer es mag sein, dass es teilweise nervt, wenn Leute zu faul sind um bei Google&Co zu suchen und gleich Ihr Wehwehchen hier preisgeben. Es gibt auch noch "Einzelkämpfer" wie mich, die einfach nur auf dem Schlauch stehen und den Wald vor lauter Bäume nicht sehen!
Nur so eine Analyse/Erklärung wie die von Tommi hilft hier weiter! Alles andere meiner Meinung nach nicht...
 
Werbung:
es mag sein, dass es teilweise nervt, wenn Leute zu faul sind um bei Google&Co zu suchen und gleich Ihr Wehwehchen hier preisgeben.

Ich hatte nicht die Zeit, die Beschreibung auf Wikipedia mir so durchzulesen, daß ich es erklären konnte. Meiner Meinung nach sind in Foren wie hier Hinweise auf eine konkrete Dokumentation für den Fragesteller aber auch ausreichend und hilfreich. Mag sein, daß Du das anders siehst.
 
Zurück
Oben