Delphi-PRAXiS
Seite 3 von 3     123   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datum zu KW mittels SQL (https://www.delphipraxis.net/121378-datum-zu-kw-mittels-sql.html)

PASST 12. Feb 2009 15:21

Re: Datum zu KW mittels SQL
 
Datum ist vom Typ smalldatetime.

Durch deinen Tipp des Einkreisens habe ich festgestellt, dass der Fehler auftritt, wenn ich den 2.1.2009 in die Abfrage mit einschließe. Zu den Daten 1.1., 3.1. und 4.1. gibt es keine Datensätze. Demzufolge muss in der Funktion bzgl. dem Abschnitt
"--Jan 1-3 may belong to the previous year " etwas falsch sein. Genau darauf verweist ja auch die SQL Fehlermeldung.

PASST 12. Feb 2009 15:40

Re: Datum zu KW mittels SQL
 
Warum in der UDF im Bereich dieses Sonderfalls der ersten drei Januartage ein Fehler ist, finde ich nicht heraus.

Ich habe jetzt die ISOweek UDF so abgeändert, dass die Sonderfälle nicht weiter bearbeitet werden. Dass jetzt die ersten drei Januartage zur KW 0 oder die letzten drei Dezembertage zur KW 53 führen, ist mir für meine Auswertungen sogar lieber.

Nichtsdestotrotz interessiert mich die Lösung zu diesen Fehler weiterhin.

nahpets 12. Feb 2009 15:47

Re: Datum zu KW mittels SQL
 
Hallo,

führe bitte mal auf Deinem SQL-Server folgendes SQL aus:
SQL-Code:
select DATEPART(wk, '01.01.2009') + 1 - DATEPART(wk, CAST( DATEPART( yy, '01.01.2009' ) AS CHAR(4) ) + '0104' ),
DATEPART(wk, '01.01.2009') + 1,
- DATEPART(wk, CAST( DATEPART( yy, '01.01.2009' ) AS CHAR(4) ) + '0104' )
Bei mir kommt als Ergebnis 1, 2 , -1 raus. Eigentlich dürfte die Funktion den Bereich in der IF-Abfrage
SQL-Code:
IF ( @ISOweek = 0 )
nicht durchlaufen.
Habe jetzt mal die Funktion bei mir angelegt und für die Werte 01.01.2009 bis 12.01.2009 getestet. Es tritt kein Fehler auf. Hast Du da irgendein Problem mit Datenbankeinstellungen?

PASST 12. Feb 2009 15:55

Re: Datum zu KW mittels SQL
 
Bei mir ist das Ergebnis 0, 2, -2

Ich habe MSSQL Server 2000

nahpets 12. Feb 2009 16:07

Re: Datum zu KW mittels SQL
 
Hallo,

ich habe 2003, d. h.: Die Wochenberechnung der SQL-Server-Varianten unterscheidet sich. Da wirst Du Deine Funktion entsprechend anpassen müssen.

PASST 12. Feb 2009 16:10

Re: Datum zu KW mittels SQL
 
Wo sind denn die Unterschiede in Datepart in den verschiedenen SQL Server Versionen?
Gibt es ein MS Dokument dazu?

nahpets 13. Feb 2009 08:54

Re: Datum zu KW mittels SQL
 
Hallo,
Zitat:

Zitat von PASST
Wo sind denn die Unterschiede in Datepart in den verschiedenen SQL Server Versionen?
Gibt es ein MS Dokument dazu?

die Frage kann ich Dir nicht beantworten.

Versuche es bitte mal mit Google:

+datepart +sql +server +2000 +msdn
+datepart +sql +server +2003 +msdn
+datepart +sql +server +2005 +msdn
+datepart +sql +server +2008 +msdn
Du findest überall Beschreibungen zu Datepart. Mir ist es auf die Schnelle nicht gelungen, hier eine Seite zu finden, die die Unterschiede zwischen den einzelnen Versionen heraushebt.

PASST 13. Feb 2009 09:07

Re: Datum zu KW mittels SQL
 
Danke schon mal für die Links.

Die Frage ist, wer von uns beiden die 'falsche' SQL Server Version einsetzt. Ich habe die fn_ISOweek() vom dotnetnukeblog, welche in der ersten Antwort in diesem Thread gepostet wurde. Auf dieser Seite wird auf DATEPART aus Transact-SQL Reference (SQL Server 2000) von MSDN verwiesen. Demzufolge gehe ich davon aus, dass die ISOweek Funktion für MSSQL 2000 geschrieben wurde.

Tatsache ist aber, dass die beiden MSSQL Versionen unterschiedliche Resultate ausgeben. Was davon die richtige kann ich jetzt auf die schnelle nicht beurteilen.

nahpets 13. Feb 2009 09:53

Re: Datum zu KW mittels SQL
 
Hallo,
Zitat:

Zitat von PASST
Danke schon mal für die Links.

Die Frage ist, wer von uns beiden die 'falsche' SQL Server Version einsetzt. Ich habe die fn_ISOweek() vom dotnetnukeblog, welche in der ersten Antwort in diesem Thread gepostet wurde. Auf dieser Seite wird auf DATEPART aus Transact-SQL Reference (SQL Server 2000) von MSDN verwiesen. Demzufolge gehe ich davon aus, dass die ISOweek Funktion für MSSQL 2000 geschrieben wurde.

Tatsache ist aber, dass die beiden MSSQL Versionen unterschiedliche Resultate ausgeben. Was davon die richtige kann ich jetzt auf die schnelle nicht beurteilen.

ich spekuliere mal ein bisserl:
Zitat:

Zitat von MSDN zu SQL-Server 2000
http://msdn.microsoft.com/en-us/library/aa258265(SQL.80).aspx
The week (wk, ww) datepart reflects changes made to SET DATEFIRST. January 1 of any year defines the starting number for the week datepart, for example: DATEPART(wk, 'Jan 1, xxxx') = 1, where xxxx is any year.

Zitat:

Zitat von MSDN zu SQL-Server 2005
http://msdn.microsoft.com/en-us/library/ms174420(SQL.90).aspx
The week (wk, ww) datepart reflects changes made to SET DATEFIRST. January 1 of any year defines the starting number for the week datepart, for example: DATEPART(wk, 'Jan 1, xxxx') = 1, where xxxx is any year.

Dies dürfte, wenn ich mich nicht irre, nicht der ISO entsprechen und macht daher die Funktion fn_ISOWeek erst erforderlich.
Zitat:

Zitat von MSDN zu SQL-Server 2008
http://msdn.microsoft.com/en-us/library/ms174420.aspx
datepart Abbreviations
...
week wk, ww
...
ISO_WEEK isowk, isoww

Da ist dann was dazugekommen.
Ich gehe mal davon aus, dass zwischen den einzelnen Versionen in dem Bereich Anpassungen vorgenommen wurden. Ob das jetzt irgendwo dokumentiert ist, kann ich nicht sagen. Da habe ich auch nicht die Zeit, um das herauszufinden.

PASST 13. Feb 2009 10:02

Re: Datum zu KW mittels SQL
 
Bzgl. wk,ww macht die msdn für MSSQL 2008 die selbe Aussage wie für SQL 2000+2005
Zitat:

week and weekday datepart Arguments
When datepart is week (wk, ww) or weekday (dw), the return value depends on the value that is set by using SET DATEFIRST.
Es ist halt beim 2008 die Fkt ISO_WEEK dazugekommen.

Möglicherweise resultieren unsere Unterschiede in
SQL-Code:
select DATEPART(wk, '01.01.2009') + 1 - DATEPART(wk, CAST( DATEPART( yy, '01.01.2009' ) AS CHAR(4) ) + '0104' ),
DATEPART(wk, '01.01.2009') + 1,
- DATEPART(wk, CAST( DATEPART( yy, '01.01.2009' ) AS CHAR(4) ) + '0104' )
aus unterschiedlichen Landeseinstellungen. Wochenerster scheint im englischsprachlichen Raum der Sonntag zu sein und im deutschsprachigen der Montag.


Alle Zeitangaben in WEZ +1. Es ist jetzt 16:48 Uhr.
Seite 3 von 3     123   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz