Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Datenbanken (https://www.delphipraxis.net/15-datenbanken/)
-   -   Delphi Datumsfunktionen bei Firebird (https://www.delphipraxis.net/43444-datumsfunktionen-bei-firebird.html)

buyden 4. Apr 2005 10:03

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:
 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;
leider bekomm ich immer nen arithmetischen Fehler von Firebird.
"Eingangsdatum" ist DATE.

einfach month(eingangsdatum) möchte Firebird ja gar nicht.

das nächste query braucht die aktuelle Woche.

Ideen??

omata 4. Apr 2005 21:19

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:
SELECT (1.000 * COUNT(nummer)) / (COUNT(DISTINCT eingangsdatum))
FROM auftrag
WHERE EXTRACT(MONTH FROM eingangsdatum) = :monat
HAVING COUNT(DISTINCT eingangsdatum) > 0
MfG
Thorsten

buyden 5. Apr 2005 12:25

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.

omata 5. Apr 2005 18:55

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

buyden 7. Apr 2005 09:28

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:
  with frmdata.qustat3 do
    begin
      close;
      sql.Clear;
      sql.Add('SELECT COUNT(nummer)
               FROM auftrag
               WHERE EXTRACT(WEEK FROM ausgangsdatum)= '+inttostr(woche)+' ;');
      open;
    end;
Ist mir langsam zu dumm wegen jedem Misst nachzufragen aber ich hab noch keine Dokumentation von Firebird SQL, die nicht 50€ kostet, gefunden.

kiar 7. Apr 2005 10:28

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 Hierhier etwas.

raik

buyden 7. Apr 2005 14:39

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:

kiar 7. Apr 2005 15:17

Re: Datumsfunktionen bei Firebird
 
hallo,

dann bastele dir ebend eine Funktion :mrgreen:

hier findest du eine anleitungich mache mir eine Funktion

raik

buyden 11. Apr 2005 15:12

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

kiar 11. Apr 2005 15:28

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

kiar 11. Apr 2005 17:43

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

Hansa 11. Apr 2005 18:44

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

kiar 11. Apr 2005 19:06

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

Hansa 11. Apr 2005 19:17

Re: Datumsfunktionen bei Firebird
 
Zitat:

Zitat von kiar
..
wo hast du die denn her?

Aus meinem Vorratskeller, hab ich doch gesagt. Der ist gut bestückt, wer weiß. 8) :mrgreen:

buyden 11. Apr 2005 21:33

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