[NEWSboard IBMi Forum]
  1. #1
    Registriert seit
    Feb 2006
    Beiträge
    25

    Mit SQL Stunden berechnen

    Guten Tag zusammen

    ich hätte da gerne ein Problem.

    Ich muss die Differenz in Stunden berechnen mit Datum und Uhrzeit. Die Formate für Datum sind YYYYMMDD (packed 8,0) und Zeit hhmm (packed 4,0)

    Meine Abfrage liefert diese Daten:

    Error Error Actual Act f
    date time f task task
    20080408 641 20080313 1400
    20080117 1507 20080117 1524
    20080117 1526 20080117 1533
    20080213 1623 20080214 945
    20080407 1218 20080407 1224
    20080429 1552 20080429 1557


    Wie kann/muss ich dies anstellen, dass ich die Differenz zwischen z.B

    13.2.2008 16Uhr23 und dem 14.2.2008 9Uhr 45 in Stunden rausbekomme?

    Besten Dank für eure prompte und kompetente Hilfe.

    Liebe Grüsse
    mikka_71



  2. #2
    Joe is offline [professional_User]
    Registriert seit
    Mar 2001
    Beiträge
    365
    Hallo

    Von / Bis als Timestamp erzeugen

    und mit SQL HOUR(Von-Bis) , Minute(von-Bis),
    Second(von-bis) auswerten

    Gruß
    Joe

  3. #3
    Joe is offline [professional_User]
    Registriert seit
    Mar 2001
    Beiträge
    365
    Zitat Zitat von Joe Beitrag anzeigen
    Hallo

    Von / Bis als Timestamp erzeugen

    und mit SQL HOUR(Von-Bis) , Minute(von-Bis),
    Second(von-bis) auswerten

    Gruß
    Joe
    ...und in RPG mit den entsprechenden BIFS
    %HOURS, %Minutes, %Seconds

    Gruß Joe

  4. #4
    Registriert seit
    Aug 2001
    Beiträge
    2.873
    Mit SQL nicht ganz einfach!
    Da zunächst das numerische Datum und die numerische Uhrzeit in eine zulässige alphanumerische Aufbereitung einer Zeitmarke konvertiert werden müssen. Dieser Alphastring muss dann in einer Zeitmarke konvertiert werden. Die Zeitmarken sind erforderlich, da die Differenz über Mitternacht gerechnet werden muss.

    Werden in SQL 2 Zeitmarken voneinander subtrahiert, so ist das Ergebnis immer ein numerischer werden mit dem folgenden Aufbau: JJJJMMDDHHMMSS,MSMSMS, d.h. as Ergebnis ist die Differenz in Jahren, Monate, Tagen, Stunde, Minuten, Sekunden und Mikro-Sekunden. Ansonsten ist es nur möglich die Differenz (bei Datums und Zeitmarken-Feldern) mit Hilfe der Funktion DAYS() in Tagen zu errechnen oder wenn 2 Zeitwerte vorliegen kann die Differenz mit Hilfe der Funktion Midnight_Seconds in Sekunden gerechnet werden.

    Ansonsten gibt es noch die Funktion TimeStampDiff, mit der über eine alphanumerische Zeitmarken-Differenz alle möglichen Zeitdifferenzen berechnet werden können. (Allerdings werden Werte abgeschnitten, d.h. wenn die Differenz in Stunden gerechnet wird und die tatsächliche Differenz ist 17 Stunden und 43 Minuten, ist das Ergebnis 17 Stunden. Außerdem wird von den folgenden Annahmen ausgegangen:
    1. Ein Jahr hat immer 365 Tage
    2. Ein Monat hat immer 30 Tage

    Wenn Dir das reicht, kannst Du folgendes versuchen:
    PHP-Code:
    select timestampdiff(8Char(                                      
           
    Timestamp(digits(datum2concat digits(zeit2concat '00')- 
           
    Timestamp(digits(datum1concat digits(zeit1concat '00')))    
    from MyTable 
    Birgitta
    Birgitta Hauser

    Anwendungsmodernisierung, Beratung, Schulungen, Programmierung im Bereich RPG, SQL und Datenbank
    IBM Champion seit 2020 - 4. Jahr in Folge
    Birgitta Hauser - Modernization - Education - Consulting on IBM i

  5. #5
    Registriert seit
    Feb 2006
    Beiträge
    25
    Hallo Brigitta

    danke für den Input. Timestamdiff gefällt mir.

    Kleine Nachfrage noch, wofür steht denn die 8 in 'timestampdiff(8.....'

    Freundliche Grüsse
    mikka_71

  6. #6
    Registriert seit
    Feb 2006
    Beiträge
    25
    und och gebe mir die Antwort selbst. Verzeihung...

    TIMESTAMPDIFF scalar function



    >>-TIMESTAMPDIFF--(--expression--,--expression--)--------------><The schema is SYSFUN.
    Returns an estimated number of intervals of the type defined by the first argument, based on the difference between two timestamps.
    The first argument can be either INTEGER or SMALLINT. Valid values of interval (the first argument) are:
    1
    Fractions of a second
    2
    Seconds
    4
    Minutes
    8
    Hours
    16
    Days
    32
    Weeks
    64
    Months
    128
    Quarters
    256
    Years
    The second argument is the result of subtracting two timestamps and converting the result to CHAR(22). In a Unicode database, if a supplied argument is a graphic string, it is first converted to a character string before the function is executed.
    The result of the function is INTEGER. The result can be null; if the argument is null, the result is the null value.
    The following assumptions may be used in estimating a difference:
    • There are 365 days in a year.
    • There are 30 days in a month.
    • There are 24 hours in a day.
    • There are 60 minutes in an hour.
    • There are 60 seconds in a minute.
    These assumptions are used when converting the information in the second argument, which is a timestamp duration, to the interval type specified in the first argument. The returned estimate may vary by a number of days. For example, if the number of days (interval 16) is requested for the difference between '1997-03-01-00.00.00' and '1997-02-01-00.00.00', the result is 30. This is because the difference between the timestamps is 1 month, and the assumption of 30 days in a month applies.
    Example:
    The following example returns 4277, the number of minutes between two timestamps:

    TIMESTAMPDIFF(4,CHAR(TIMESTAMP('2001-09-29-11.25.42.483219') - TIMESTAMP('2001-09-26-12.07.58.065497'))) This topic can be found in: SQL Reference, Volume 1.

  7. #7
    Registriert seit
    Feb 2001
    Beiträge
    20.241
    "30 days in a month" ist da schon ein Problem.
    Die Differenz vom 28.02. 23:00 zum 01.03. 00:00 wird z.B. mit 25 Stunden ausgewiesen.

    Die Funktion ist also nicht sehr hilfreich !!! <= Vergesst es

    Nachtrag:
    Wenn man mit 2008 testet ist das ja rchtig. In 2009 gibt er mir auch nur 1 Stunde.

    In RPGLE heißt die Funktion %DIFF().
    Dienstleistungen? Die gibt es hier: http://www.fuerchau.de
    Das Excel-AddIn: https://www.ftsolutions.de/index.php/downloads
    BI? Da war doch noch was: http://www.ftsolutions.de

  8. #8
    Registriert seit
    Jul 2005
    Beiträge
    232
    Zitat Zitat von mikka_71 Beitrag anzeigen
    Guten Tag zusammen

    ich hätte da gerne ein Problem.

    ....
    Probleme gibts hier, sogar gegen Geld!: Probleme lösen Problem - needaproblem.com

    (Vollkommen off-topic... aber da kann ich nicht anders)
    __________________________________
    -An eye for an eye leaves the whole world blind- -Mahatma Ghandi-

Similar Threads

  1. RPGLE - SQL
    By christian_lettner in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 16-11-06, 10:15
  2. SQL - Cursor vernichten ?!?
    By FNeurieser in forum NEWSboard Programmierung
    Antworten: 3
    Letzter Beitrag: 11-10-06, 14:53
  3. SQL und OBJLCK
    By malzusrex in forum IBM i Hauptforum
    Antworten: 8
    Letzter Beitrag: 19-09-06, 11:04
  4. SQL - Fehler
    By Kaufmann in forum IBM i Hauptforum
    Antworten: 11
    Letzter Beitrag: 28-06-06, 14:11
  5. SQL .. for update of (RPG embedded SQL)
    By loeweadolf in forum NEWSboard Programmierung
    Antworten: 2
    Letzter Beitrag: 01-06-06, 09:43

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • You may not post attachments
  • You may not edit your posts
  •