Announcement

Collapse
No announcement yet.

Zeitberechnung mit SQL

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Zeitberechnung mit SQL

    Moin moin

    ich habe 2 time felder (kommt und geht) und möchte nun
    die differenz in ein 3. time-feld speichern.

    anwesenheit = geht - kommt funktioniert nicht.

    Hat vielleicht jemand eine Lösung ???

  • #2
    Egal welches Datenbank-System man verwendet: Zeitspannen niemals in ein time-Feld speichern. Der Datentyp Time ist nur für Zeitpunkte gedacht und sonst nichts. Zeitspannen werden, abhängig von Genauigkeit und Einsatz entweder als Float oder meist als Integer (Anzahl in Minuten oder Sekunden) gespeichert.
    Ich verwende selber Firebird nicht und kann daher nicht sagen, welche Datums/Zeitfunktionen vorhanden sind, aber eines erscheint mir hier noch erwähnenswert: nur mit Zeitfeldern ohne Berücksichtigung des Datums zu arbeiten würde ich gar nicht machen, irgendwo läuft da früher oder später garantiert etwas schief. Also lieber gleich DateTime verwenden.
    Im Prinzip handelt es sich bei DateTime sowieso um ein Float-Feld, sodaß ein
    differenz = cast(gehen as float) - cast(kommen as float) (genaue Schreibweise weiß ich jetzt nicht)
    eigentlich ein brauchbares Ergebnis liefern sollte. 0,25 wäre zB. 1/4 eines Tages, also 6 Stunden. <br>
    bye, Helmu

    Comment


    • #3
      unabhängig davon ob die differenz sich sinnvoll im time feld unterbringen lässt, schau dir mal die FreeAdhocUDF an
      www.ibexpert.com/download/udf

      da sind reichlich funktionen für zeitdifferenzen drin

      Gruß

      Holger
      www.ibexpert.co

      Comment


      • #4
        Moin Moin

        erstmal Danke

        eigentlich wollte ich es mir nur einfach machen. Also ein DBGrid
        nehmen und ohne Programmieraufwand KOMMT GEHT und ZEIT anzeigen.

        ZEIT = cast (GEHT as Integer) - cast (KOMMT as INTEGER) liefert mir die verstrichenen Sekunden zurück. Könnte ich sicherlich irgendwie umrechnen. Ich schau mir erstmal die UDF an

        Henr

        Comment


        • #5
          und es geht doch :

          SET TERM ^ ;

          CREATE PROCEDURE TESTZEIT
          RETURNS (
          RES TIME,
          STUNDEN INTEGER,
          MINUTEN INTEGER,
          SEKUNDEN INTEGER)
          AS
          DECLARE VARIABLE S VARCHAR(10);
          begin

          select cast (geht - kommt as integer) from anwesenheit
          where lfdnr = 4
          into :sekunden;

          minuten = sekunden / 60;
          sekunden = sekunden - (minuten * 60); /* errechnen sekunden */
          stunden = minuten / 60; /* errechnen stunden */
          minuten = minuten - (stunden * 60); /* errechnen minuten */

          s = stunden || ':' || minuten || ':' || sekunden ;
          res = cast (s as time);

          end^

          SET TERM ; ^

          DESCRIBE PARAMETER RES PROCEDURE TESTZEIT
          'rückgabe als Time für schnelle anzeige';

          GRANT SELECT ON ANWESENHEIT TO PROCEDURE TESTZEIT;

          GRANT EXECUTE ON PROCEDURE TESTZEIT TO SYSDBA

          Comment

          Working...
          X