PDA

View Full Version : Mit SQL Stunden berechnen



mikka_71
06-03-09, 10:14
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

Joe
06-03-09, 11:07
Hallo

Von / Bis als Timestamp erzeugen

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

Gruß
Joe

Joe
06-03-09, 11:10
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

B.Hauser
06-03-09, 11:13
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:


select timestampdiff(8, Char(
Timestamp(digits(datum2) concat digits(zeit2) concat '00')-
Timestamp(digits(datum1) concat digits(zeit1) concat '00')))
from MyTable

Birgitta

mikka_71
06-03-09, 12:45
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

mikka_71
06-03-09, 12:50
und och gebe mir die Antwort selbst. Verzeihung...

TIMESTAMPDIFF scalar function



http://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/c.gifhttp://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/c.gif (http://publib.boulder.ibm.com/infocenter/db2luw/v8//topic/com.ibm.db2.udb.doc/admin/r0000861.htm#skipsyn-133)>>-TIMESTAMPDIFF--(--expression--,--expression--)--------------><</PRE>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:
<DL><DT class=bold>1 <DD>Fractions of a second <DT class=bold>2 <DD>Seconds <DT class=bold>4 <DD>Minutes <DT class=bold>8 <DD>Hours <DT class=bold>16 <DD>Days <DT class=bold>32 <DD>Weeks <DT class=bold>64 <DD>Months <DT class=bold>128 <DD>Quarters <DT class=bold>256 <DD>Years </DD></DL>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'))) </PRE>This topic can be found in: <CITE>SQL Reference, Volume 1</CITE>.

Fuerchau
06-03-09, 14:31
"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().

pwrdwnsys
08-03-09, 18:45
Guten Tag zusammen

ich hätte da gerne ein Problem.

....


Probleme gibts hier, sogar gegen Geld!: Probleme lösen Problem - needaproblem.com (http://www.needaproblem.com/de/)

(Vollkommen off-topic... aber da kann ich nicht anders)