Delphi-PRAXiS

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)

MondoShiva 26. Sep 2008 11:44

Datenbank: acces • Zugriff über: ADO

Datum zu KW mittels SQL
 
Hallo,...

Ich möchte die arbeitszeit pro woche einzelner mitarbeiter herrausfinden habe nur ein paar probleme damit und zwar wie ich das datum zu einer KW umwandle bestenfalls via SQL bin jedoch nicht sicher ob das eine acces datenbank unterstützt.

felder der ersten tabelle wären hier datum , dauer(die zeit pro tag), ID
felder der 2ten tabelle wären Vorname , Nachname und ID

die sql abfrage das ich zu der ID den namen bekomme etc hab ich aber ebenhalt krieg ichs mit der gesamt zeit für eine woche nicht hin glaube aber das es auch über sql amchbar ist.

bisher sieht das ganze so aus

SQL-Code:
select
personal.personalnr,
personal.vorname,
personal.nachname,
termindaten.datum,
termindaten.dauer
from personal
left join termindaten on (personal.personalnr=termindaten.personalnr)
order by termindaten.datum

nahpets 26. Sep 2008 11:57

Re: Datum zu KW mittels SQL
 
Hallo,

guckst Du hier: http://www.dotnetnukeblog.de/Mit+SQL...Ermittlen.aspx
Weiss nit, ob Access das kann.

Stephan

MondoShiva 26. Sep 2008 12:12

Re: Datum zu KW mittels SQL
 
hmm kann ich jetzt nicht sooo viel mit anfangen ^^

mkinzler 26. Sep 2008 14:22

Re: Datum zu KW mittels SQL
 
Brauchst du auch nicht, weil du ein junger intelligenter Programmierer bist, der weiss dass der Einsatz eigenen Gehirnschwalzes unnötig ist, da sowieso einer hilft.

http://www.access-paradies.de/tipps/..._ermitteln.php

Findest man auch wenn amnn access + kalenderwoche in eine suchmaschine eingibt

PASST 12. Feb 2009 10:52

Re: Datum zu KW mittels SQL
 
Hi,
ich möchte das Thema nochmals aufnehmen. Die ISOweek aus dem dotnetnukeblog ist für mich interessant und somit habe ich die StoredProcedure bzw. UserDefinedFunction im MSSQL Server eingetragen. Leider fehlt mir aber das Grundlagenwissen wie ich die StoredProcedure aus einem SQL Statement heraus anspreche.
SQL-Code:
select ISOweek(Datum) from Tabelle
// klappt nicht, 'ISOweek' is not a recognized function name.
Kann mir jemand weiterhelfen?

Gruß
Peter

DeddyH 12. Feb 2009 10:58

Re: Datum zu KW mittels SQL
 
Hast Du den unteren Teil auch gelesen?
Zitat:

Um das allerdings auch in einer Stored Procedure (oder direkt im SQL-Statement) zu verwenden kann man auch eine Userdefined function anlegen:

SQL-Code:
CREATE FUNCTION dbo.fn_ISOweek (
...


PASST 12. Feb 2009 11:05

Re: Datum zu KW mittels SQL
 
Jain, ich habe ihn gelesen, aber nicht verstanden. Mir fehlen die Grundlagen des Arbeitens mit StoredProcedures bzw. UDFs. Ich habe mir jetzt aber alles zusammengereimt und ein Ergebnis erhalten.

Im SQL-Statement muss ich (zumindest bei mir) diese neu angelegte UDF so ansprechen:
SQL-Code:
select dbo.fn_ISOweek(Datum) from Tabelle
Dann erhalte ich auch mein Ergebnis.

DeddyH 12. Feb 2009 11:08

Re: Datum zu KW mittels SQL
 
Achso, das wird daran liegen, dass die Funktion ja dem Nutzer dbo "gehört".

PASST 12. Feb 2009 11:09

Re: Datum zu KW mittels SQL
 
Permissions ändern?

DeddyH 12. Feb 2009 11:13

Re: Datum zu KW mittels SQL
 
Die Permissions zum Ausführen hast Du doch, wo ist das Problem?

PASST 12. Feb 2009 11:15

Re: Datum zu KW mittels SQL
 
Das mit dem User dbo verstehe ich nicht.

DeddyH 12. Feb 2009 11:22

Re: Datum zu KW mittels SQL
 
Die Funktion wurde ja explizit im Schema "dbo" angelegt, d.h. es "gehört" allen Nutzern, die der Rolle "DB-Owner" angehören (hoffentlich schreib ich jetzt nicht zuviel Quatsch). Entgegen meiner vorherigen Aussage gibt es den "Nutzer" dbo AFAIK gar nicht, sondern das ist eine Art Alias auf den DB-Owner. Sollte das alles so nicht richtig sein, bitte ich um Richtigstellung durch einen MS-SQL-Kundigen.

PASST 12. Feb 2009 11:24

Re: Datum zu KW mittels SQL
 
danke

PASST 12. Feb 2009 14:19

Re: Datum zu KW mittels SQL
 
Ich habe in diesem Zusammenhang ein neues Problem.

Diese Abfrage funktioniert:
SQL-Code:
select dbo.fn_ISOweek(Datum)
from Tabelle
where year(Datum) = year(GetDate)
and month(Datum) = month(GetDate())
Die folgende Abfrage erzeugt die Fehlermeldung:
SQL-Code:
Server: Msg 557, Level 16, State 2, Procedure fn_ISOweek, Line 18
Only functions and extended stored procedures can be executed from within a function.

select dbo.fn_ISOweek(Datum)
from Tabelle
where year(Datum) = year(GetDate)
and month(Datum) < month(GetDate())
Warum wird bei "<" und "=" ein Unterschied gemacht, der zu dieser Fehlermeldung führt?

nahpets 12. Feb 2009 14:30

Re: Datum zu KW mittels SQL
 
Hallo,

laut Fehlermeldung ist das Problem in der Zeile 18 der Funktion fn_ISOWeek zu suchen.
Die Abfrage auf < könnte eventuell auch Zeilen finden, in denen Datum Null ist und dies könnte Deine Funktion in die Pedrullie bringen.

Probiere es mal mit
SQL-Code:
select dbo.fn_ISOweek(Datum)
from Tabelle
where year(Datum) = year(GetDate)
and month(IsNull(Datum,'01.01.1900')) < month(GetDate())
Ändere Deine Funktion ggfls. so, dass sie auch mit Null-Werten umgehen kann.

PS: Das ist jetzt nur 'ne Vermutung.

PASST 12. Feb 2009 14:32

Re: Datum zu KW mittels SQL
 
Nein, ich habe gerade geprüft, NULL-Werte gibt es nicht.

nahpets 12. Feb 2009 14:49

Re: Datum zu KW mittels SQL
 
Hallo,

zeig' uns bitte mal die ganze Funktion, so dass man sehen kann was in Zeile 18 passiert und wo da eventuell ein Fehler liegen könnte. Tritt der Fehler auch bei > oder <> oder <= oder >= auf?
Sind überall ein gültige Datumswerte enthalten?

PASST 12. Feb 2009 14:53

Re: Datum zu KW mittels SQL
 
Irgendwas muss mit den Daten nicht stimmen!

Am "=" oder "<" liegt es nicht.
SQL-Code:
select dbo.fn_ISOweek(Datum)
from Tabelle
where year(Datum) = 2009
-- Resultat ist die Fehlermeldung:
Server: Msg 557, Level 16, State 2, Procedure fn_ISOweek, Line 18
Only functions and extended stored procedures can be executed from within a function.


select dbo.fn_ISOweek(Datum)
from Tabelle
where year(Datum) = 2008
-- Resultat ist keine Fehlermeldung
Irgendwo müssen in meinen Daten aus 2009 ein Fehler sein. Wie kann ich das feststellen?

SQL-Code:
CREATE 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  <-- Zeile 18
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

PASST 12. Feb 2009 15:00

Re: Datum zu KW mittels SQL
 
SQL-Code:
select Datum
from Tabelle
where year(Datum) = 2009
Zeigt mir etwa 7000 Sätze an, optisch kann dabei aber nicht feststellen ob ein Fehler vorliegt.

nahpets 12. Feb 2009 15:07

Re: Datum zu KW mittels SQL
 
Hallo,
Zitat:

Zitat von PASST
Irgendwas muss mit den Daten nicht stimmen!

Das sehe ich auch so.

kannst Du aus dieser Zeile
SQL-Code:
EXEC @ISOWeek = ISOWeek @DATE2
irgendwie @DATE2 ausgeben?
Notfalls vor dem Exec in eine Tabelle schreiben.
So nach dem Motto:
SQL-Code:
create table pruefmalwas (Datum Varchar(200));
Dieser Tabelle einen Datensatz gönnen:
SQL-Code:
Insert into pruefmalwas values ('01.01.1900');
Deine Funktion vor dem EXEC um ein
SQL-Code:
Update pruefmalwas set Datum = @DATE2;
ergänzen.
Dann sollte in der Tabelle der Wert stehen, der zu dem Fehler führt. Eventuell musst da aber noch ein Commit gemacht werden.

Der Fehler muss in den 2009er Daten liegen, sind das viele Daten oder kannst Du die auch von Hand überprüfen?

Ansonsten:
SQL-Code:
select dbo.fn_ISOweek(Datum)
from Tabelle
where year(Datum) = 2008
and  month(Datum) = 1
und das dann für alle Monate, bis es kracht und dann notfalls auch noch für den betreffenden Monat für alle Tage.

Monate könntest Du auch mit < 7 anfangen, wenn kein Fehler > 6 und so an den Fehler herantasten.
Welchen Datentyp hat Datum in der Datenbank?

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 13:59 Uhr.

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