Delphi-PRAXiS
Seite 2 von 3     12 3      

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 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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 05:26 Uhr.
Seite 2 von 3     12 3      

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