![]() |
Datenbank: Firebird • Version: 1.5 • Zugriff über: ZEOS
Datumsfunktionen bei Firebird
Hi,
ich hab mal wieder ein Problem mit Firebird SQL: ich möchte nen Tagesdurchschnitt des aktuellen Monats berechnen und hab dazu folgenden code
Delphi-Quellcode:
leider bekomm ich immer nen arithmetischen Fehler von Firebird.
with frmdata.qustat17 do
begin close; sql.Clear; sql.add('SELECT (1.000 * COUNT(nummer)) / (COUNT(DISTINCT eingangsdatum)) FROM auftrag WHERE EXTRACT(MONTH FROM eingangsdatum)= ' + inttostr(monthof(date))+';'); open; end; "Eingangsdatum" ist DATE. einfach month(eingangsdatum) möchte Firebird ja gar nicht. das nächste query braucht die aktuelle Woche. Ideen?? |
Re: Datumsfunktionen bei Firebird
Moin,
der arithmetische Fehler tritt auf, wenn das Ergebnis keine Zeilen enthält (also durch Null geteilt wird). Eigentlich hätte ich erwartet, dass es dann keine Zeile gibt. Firebird sieht das aber leider anders. Man kann dieses Verhalten aber erzwingen...
SQL-Code:
MfG
SELECT (1.000 * COUNT(nummer)) / (COUNT(DISTINCT eingangsdatum))
FROM auftrag WHERE EXTRACT(MONTH FROM eingangsdatum) = :monat HAVING COUNT(DISTINCT eingangsdatum) > 0 Thorsten |
Re: Datumsfunktionen bei Firebird
OK, nen Fehler bringt Firebird jetzt zwar nicht mehr aber irgendwie stimmt das Ergebnis auch nicht.
bei 12 aufträgen in 3 tagen (im aktuellen Monat) sollte doch eigentlich 4 rauskommen, das Query liefert aber 2,666 zurück. |
Re: Datumsfunktionen bei Firebird
Moin,
tja ich hatte zwar einbißchen herumprobiert, hatte das Problem so nicht gesehen. Schade, war nur ein Versuch Firebird zu zwingen das Richtige zu tun. Da das scheinbar nicht geht, musst du wohl anders daran gehen. Teste doch einfach vorher, ob es Einträge für den Monat gibt, also COUNT(DISTINCT eingangsdatum)) > 0 ist. Wenn ja, dann machst du deine Abfrage (ohne den HAVING-Teil). MfG Thorsten |
Re: Datumsfunktionen bei Firebird
Hi,
ich hab das ganze jetzt umgangen, indem ich nur die einzelnen Werte per SQL abfrage und dann mit den entsprechenden Variablen rechne. nicht gerade Speicherschonend aber zweckmäßig. Jetzt hab ich nur noch das Problem, das Firebird nicht die Woche aus dem Datum extrahieren kann.
Delphi-Quellcode:
Ist mir langsam zu dumm wegen jedem Misst nachzufragen aber ich hab noch keine Dokumentation von Firebird SQL, die nicht 50€ kostet, gefunden.
with frmdata.qustat3 do
begin close; sql.Clear; sql.Add('SELECT COUNT(nummer) FROM auftrag WHERE EXTRACT(WEEK FROM ausgangsdatum)= '+inttostr(woche)+' ;'); open; end; |
Re: Datumsfunktionen bei Firebird
hallo, ich weis jetzt nicht, ob firebird das schon implementiert hat, aber für den Interbase gab es eine funktion in der Free udf lib .
vielleicht findest du Hier ![]() raik |
Re: Datumsfunktionen bei Firebird
Es muss doch irgendwo ne brauchbare Referenz über die SQL-Funktionen in Firebird geben. Für MySQL findet man tonnenweise Informationen aber leider nicht für Firebird.
Auf deinem Link assoziieren die Firebird ausschließlich mit nem Auto - ist also nich wirklich hilfreich. :wink: |
Re: Datumsfunktionen bei Firebird
hallo,
dann bastele dir ebend eine Funktion :mrgreen: hier findest du eine anleitung ![]() raik |
Re: Datumsfunktionen bei Firebird
kann man denn die IB FreeUdfLib auch in Firebird einbinden??
die .dll hab ich jedenfalls schonmal in meinen UDF-Ordner des Embedded-Servers geschubst. Wie sag ich denn jetzt aber Firebird, das es ne Funktion aus der extra-.dll verwenden soll?? |
Re: Datumsfunktionen bei Firebird
zu mindestens funktionieren die funktionen bei mir und ich habe die .dll in einer Firebird 1.5 drin.
also einfach in ibexpert das script ib_udf.sql ausführen und fertig :mrgreen: hier ist aber keine KW function drin. raik |
Re: Datumsfunktionen bei Firebird
habe gerade gesehen, das es auch ne Fb_udf.dll gibt :mrgreen:
werde sie gleich mal laden, vllt ist da etwas dabei. raik |
Re: Datumsfunktionen bei Firebird
Von UDF hört man nicht viel gutes. Deshalb verwende ich sie nicht. Das hier hat noch irgendwo im Keller 8) rumgelegen :
SQL-Code:
Allerdings war mein erster Gedanke, die Woche im Programm zu ermitteln und die 7 Tage davon an die DB zu übergeben und nicht die Nr. der Woche. Dann kann man sich diese Procedure nämlich auch sparen. Kommt halt drauf an, was besser ist. :mrgreen:
CREATE PROCEDURE YearWeek (D DATE)
RETURNS (WEEK_NO VARCHAR(8)) AS DECLARE VARIABLE W INTEGER; /* week number */ DECLARE VARIABLE Y INTEGER; /* year the week belongs to */ BEGIN W = (EXTRACT(YEARDAY FROM D) - EXTRACT(WEEKDAY FROM D-1) + 7) / 7; Y = EXTRACT(YEAR FROM D); IF (W=0) THEN BEGIN Y = Y - 1; D = D - EXTRACT(YEARDAY FROM D) - 1; /* last day of previous year; D is used as temporary variable here */ W = (EXTRACT(YEARDAY FROM D) - EXTRACT(WEEKDAY FROM D-1) + 7) / 7; END ELSE IF (W=53 AND 4>EXTRACT(WEEKDAY FROM (D - EXTRACT(DAY FROM D) + 31))) THEN BEGIN Y = Y + 1; W = 1; END /* This is just formatting; you may prefer to make W and Y return parameters instead. */ IF (W<10) THEN WEEK_NO = '0'; ELSE WEEK_NO = ''; WEEK_NO = Y || '/' || WEEK_NO || W; SUSPEND; END |
Re: Datumsfunktionen bei Firebird
hallo hansa,
das ding funktioniert in firebird und sieht verdammt nach der fuktion von mysql aus. wo hast du die denn her? raik |
Re: Datumsfunktionen bei Firebird
Zitat:
|
Re: Datumsfunktionen bei Firebird
also die FreeUDFLib scheint zu funktionieren, bis jetzt sage er mir jedenfalls nix gegenteiliges. :tongue:
Ich dank euch erstmal für eure Hilfe. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:38 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