![]() |
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 |
Re: Datum zu KW mittels SQL
Hallo,
guckst Du hier: ![]() Weiss nit, ob Access das kann. Stephan |
Re: Datum zu KW mittels SQL
hmm kann ich jetzt nicht sooo viel mit anfangen ^^
|
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.
![]() Findest man auch wenn amnn access + kalenderwoche in eine suchmaschine eingibt |
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:
Kann mir jemand weiterhelfen?
select ISOweek(Datum) from Tabelle
// klappt nicht, 'ISOweek' is not a recognized function name. Gruß Peter |
Re: Datum zu KW mittels SQL
Hast Du den unteren Teil auch gelesen?
Zitat:
|
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:
Dann erhalte ich auch mein Ergebnis.
select dbo.fn_ISOweek(Datum) from Tabelle
|
Re: Datum zu KW mittels SQL
Achso, das wird daran liegen, dass die Funktion ja dem Nutzer dbo "gehört".
|
Re: Datum zu KW mittels SQL
Permissions ändern?
|
Re: Datum zu KW mittels SQL
Die Permissions zum Ausführen hast Du doch, wo ist das Problem?
|
Re: Datum zu KW mittels SQL
Das mit dem User dbo verstehe ich nicht.
|
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.
|
Re: Datum zu KW mittels SQL
danke
|
Re: Datum zu KW mittels SQL
Ich habe in diesem Zusammenhang ein neues Problem.
Diese Abfrage funktioniert:
SQL-Code:
Die folgende Abfrage erzeugt die Fehlermeldung:
select dbo.fn_ISOweek(Datum)
from Tabelle where year(Datum) = year(GetDate) and month(Datum) = month(GetDate())
SQL-Code:
Warum wird bei "<" und "=" ein Unterschied gemacht, der zu dieser Fehlermeldung führt?
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()) |
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:
Ändere Deine Funktion ggfls. so, dass sie auch mit Null-Werten umgehen kann.
select dbo.fn_ISOweek(Datum)
from Tabelle where year(Datum) = year(GetDate) and month(IsNull(Datum,'01.01.1900')) < month(GetDate()) PS: Das ist jetzt nur 'ne Vermutung. |
Re: Datum zu KW mittels SQL
Nein, ich habe gerade geprüft, NULL-Werte gibt es nicht.
|
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? |
Re: Datum zu KW mittels SQL
Irgendwas muss mit den Daten nicht stimmen!
Am "=" oder "<" liegt es nicht.
SQL-Code:
Irgendwo müssen in meinen Daten aus 2009 ein Fehler sein. Wie kann ich das feststellen?
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
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 |
Re: Datum zu KW mittels SQL
SQL-Code:
Zeigt mir etwa 7000 Sätze an, optisch kann dabei aber nicht feststellen ob ein Fehler vorliegt.
select Datum
from Tabelle where year(Datum) = 2009 |
Re: Datum zu KW mittels SQL
Hallo,
Zitat:
kannst Du aus dieser Zeile
SQL-Code:
irgendwie @DATE2 ausgeben?
EXEC @ISOWeek = ISOWeek @DATE2
Notfalls vor dem Exec in eine Tabelle schreiben. So nach dem Motto:
SQL-Code:
Dieser Tabelle einen Datensatz gönnen:
create table pruefmalwas (Datum Varchar(200));
SQL-Code:
Deine Funktion vor dem EXEC um ein
Insert into pruefmalwas values ('01.01.1900');
SQL-Code:
ergänzen.
Update pruefmalwas set Datum = @DATE2;
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:
und das dann für alle Monate, bis es kracht und dann notfalls auch noch für den betreffenden Monat für alle Tage.
select dbo.fn_ISOweek(Datum)
from Tabelle where year(Datum) = 2008 and month(Datum) = 1 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? |
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. |
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. |
Re: Datum zu KW mittels SQL
Hallo,
führe bitte mal auf Deinem SQL-Server folgendes SQL aus:
SQL-Code:
Bei mir kommt als Ergebnis 1, 2 , -1 raus. Eigentlich dürfte die Funktion den Bereich in der IF-Abfrage
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' )
SQL-Code:
nicht durchlaufen.
IF ( @ISOweek = 0 )
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? |
Re: Datum zu KW mittels SQL
Bei mir ist das Ergebnis 0, 2, -2
Ich habe MSSQL Server 2000 |
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. |
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? |
Re: Datum zu KW mittels SQL
Hallo,
Zitat:
Versuche es bitte mal mit Google: ![]() ![]() ![]() ![]() 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. |
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. |
Re: Datum zu KW mittels SQL
Hallo,
Zitat:
Zitat:
Zitat:
Zitat:
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. |
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:
Möglicherweise resultieren unsere Unterschiede in
SQL-Code:
aus unterschiedlichen Landeseinstellungen. Wochenerster scheint im englischsprachlichen Raum der Sonntag zu sein und im deutschsprachigen der Montag.
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' ) |
Alle Zeitangaben in WEZ +1. Es ist jetzt 08:03 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz