Milli-Sekunden bestimmen... [ERLEDIGT]

Advantage Database Server

Moderator: Moderatoren

Antworten
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Milli-Sekunden bestimmen... [ERLEDIGT]

Beitrag von UliTs »

Hallo allerseits,

ich möchte in einem SQL-Statement einem Integer-Feld die Anzahl der Milli-Sekunden, die seit Mitternacht vergangen sind, zuweisen.

Weis jemand, wie es geht?

Uli
Zuletzt geändert von UliTs am Di, 04. Jun 2013 1:13, insgesamt 1-mal geändert.
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Milli-Sekunden bestimmen...

Beitrag von georg »

Hallo, Uli -

Code: Alles auswählen

UPDATE <Table> SET <Field> = nMilliSec
Aber ich vermute, dass dies nicht die Antwort auf die Frage ist, die Du eigentlich stellen wolltest: "Wie komme ich an die Zeit in Millisekunden seit Mitternacht?"

Also, ich habe diese Seite gefunden, die auf zwei Windows APIs verweist:

http://stackoverflow.com/questions/1695 ... in-windows

Interessant fand ich den Hinweis auf den Unterschied zwischen GetSystemTime() und GetLocalTime().

Ich hoffe, das hilft Dir.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen...

Beitrag von brandelh »

int(seconds() * 1000) liefert Millisekunden, wobei die Genauigkeit nur 1/100 Sekunde beträgt.
Gruß
Hubert
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Milli-Sekunden bestimmen...

Beitrag von georg »

Hallo, Hubert -


in dem Fall kann er auch direkt Seconds() speichern. Ich würde vermuten, dass es Uli auf eine höhere Genauigkeit ankommt.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen...

Beitrag von brandelh »

Er schrieb aber von einem Integerfeld. 1/100 Sekunde ist doch deutlich genauer als 1 Sekunde ;-)

Ansonsten müsste man wohl auf die Windows-API zurückgreifen. GetSystemTime() oder GetLocalTime() ... in der Struktur gibt es Millisekunden:

http://msdn.microsoft.com/en-us/library ... 85%29.aspx
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen...

Beitrag von UliTs »

Das Entscheidende ist, dass ich innerhalb des SQL-Statements die Anzahl der Millisekunden, die seit Mitternacht vergangen sind, bestimmen muss.
Das SQL-Statement wird in einem Trigger auf dem Server ablaufen :-) .
-
Da helfen Eure bisherigen Ideen leider nicht weiter :? .

Uli

P.S. der Server läuft unter Linux :wink:
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen...

Beitrag von brandelh »

Ich kenne mich mit SQL nicht aus, aber ein TimeStamp müsste doch möglich sein. Je nach Auflösung hat der dann Millisekunden.
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen...

Beitrag von UliTs »

Ja, Hubert.
Leider bekomme ich es nicht hin, den Wert in einen integer Wert umzuwandeln.
Das ist mein Problem.

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2823
Registriert: Fr, 08. Feb 2008 21:29
Hat sich bedankt: 95 Mal
Danksagung erhalten: 13 Mal

Re: Milli-Sekunden bestimmen...

Beitrag von georg »

Hallo, Uli -


leider kenne ich ADS nicht. Es gibt bei MySQL einen Parameter, mit dem ein Timestamp immer dann aktualisiert wird, wenn der Datensatz geändert wird. Der Timestamp ist normalerweise in der Auflösung, wie Du sie willst.

a) kennst ADS ein entsprechendes Attribut für ein TIMESTAMP Feld?
b) wenn ja, mal ausprobieren und nach einem INSERT mal den Satz lesen und das Feld anschauen. Eventuell lässt sich der Inhalt ja auswerten.
Liebe Grüsse aus der Eifel,

Georg S. Lorrig
Redakteur der Wiki des Deutschprachigen Xbase-Entwickler e.V.
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
Beiträge: 15688
Registriert: Mo, 23. Jan 2006 20:54
Wohnort: Germersheim
Hat sich bedankt: 65 Mal
Danksagung erhalten: 33 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen...

Beitrag von brandelh »

Laut Seite 122 im "Advantage Database Server 9 Programierhandbuch" (das von der Devcon) verarbeitet der ADS Zeitstempel, die "optional die Angabe der Millisecunden enthalten" ...
Beispiel (im Buch): '2008-07-25 13:30:23.100'

Frage wieviel Bytes hat das Feld das du als "Integer" bezeichnest ?
86400 Sekunden hat ein Tag maximal, 86.400.000 Millisekunden => 32 Bit Long Integer, also Standard auf 32 Bit Systemen im Speicher, eventuell aber nicht in der Datenbank ;-)

Auf Seite 360 wird Integer mit 4 Byte (LONG) angegeben, aber scheinbar nicht in allen DBF ...
und auf Seite 362 gibt es ein "ModTime" (nicht in DBF ?), was einem schreibgeschützen Zeitstempel entspricht. Scheinbar wird dieser automatisch ausgefüllt.

NOW() liefert übrigens den aktuellen Zeitstempel (Seite 364 ...)
Gruß
Hubert
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen...

Beitrag von UliTs »

Hallo Georg und Hubertus,

vielen Dank für Eure Ideen.
Klar: das Beste ist, wenn man direkt ein Feld vom Typ "Zeitstempel" hat! Aber das liegt in meinem Fall nun einmal aus diversen Gründen nicht vor (die Schnittstelle, die ich benutze, unterstützt die ADT-Feld-Typen "Time" bzw. "TimeStamp" nicht bzw. nicht korrekt). Der Feld-Typ "Time" würde ansonsten exakt das machen, was ich möchte...
Es geht mir also nicht darum, wie kann ich die Tabelle verändern, damit es ohne Typumwandlung klappt :( .
Ich suche nach einer Lösung, wie ich bei einer ADT-Tabelle durch einen Trigger in eine Feldvariable vom Typ Integer (ja, Hubert: es stimmt, Integer-Felder haben bei ADT-Tabellen 4 Byte :-) ) die aktuelle Millisekundenanzahl seit Mitternacht reinbekomme.
Ich habe auch an die Benutzung von Now() oder CurTime() oder ähnlichem gedacht. Ich habe aber keine Lösung gefunden, wie ich daraus die Millisekunden durch Scalarfunktionen extrahieren kann :? .
Ich bin überzeugt, es gibt eine ganz einfache Lösung. Nur kommen wir nicht drauf...

Uli

P.S. Ich habe ADT-Tabellen und keine DBF-Tabellen
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
AUGE_OHR
Marvin
Marvin
Beiträge: 12903
Registriert: Do, 16. Mär 2006 7:55
Wohnort: Hamburg
Hat sich bedankt: 19 Mal
Danksagung erhalten: 44 Mal

Re: Milli-Sekunden bestimmen...

Beitrag von AUGE_OHR »

UliTs hat geschrieben:Leider bekomme ich es nicht hin, den Wert in einen integer Wert umzuwandeln.
für PostgreSQL würde man so was als Query verwenden

Code: Alles auswählen

SELECT EXTRACT(MILLISECONDS FROM TIME ’17:12:28.5’);

SELECT EXTRACT(MICROSECONDS FROM TIME ’17:12:28.5’);
gruss by OHR
Jimmy
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen...

Beitrag von UliTs »

Danke Jimmy,

Extract gibt es zumindest beim ADS 10.1 nicht in Verbindung mit Millisekunden, aber durch das Ausprobieren und Nachschauen bin ich auf die Funktion Frac_Second() gestoßen. Diese liefert die Millisekunden eines Zeitstempels als Integer-Wert :) :!:
Und damit konnte ich dann relativ schnell eine Lösung für den ADS bilden:

Code: Alles auswählen

SELECT ( ( Hour( Now() )*60+Minute( Now() ) )*60+Second( Now() ) )*1000+Frac_Second( Now() ) FROM System.IOTA;


Ich habe es direkt umgesetzt und ich muß sagen: die Ausführungsgeschwindigkeit liegt im Micro-Sekundenbereich, also Top! :D 8) .

Nochmals Danke an alle für die investierte Zeit :!:

Uli
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Benutzeravatar
nightcrawler
1000 working lines a day
1000 working lines a day
Beiträge: 650
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72184 Weitingen
Hat sich bedankt: 3 Mal
Danksagung erhalten: 96 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen...

Beitrag von nightcrawler »

auch wenn es schon erledigt ist: schau mal die funktion TimeStampDiff an. Damit kann die Differenz zweier Zeitstempel auch in msec (SQL_TSI_FRAC_SECOND) ausgerechnet werden. Müsste dann irgendwie so lauten:

Code: Alles auswählen

timestampdiff(SQL_TSI_FRAC_SECOND, cast(curdate() as SQL_TIMESTAMP), now())
--
Joachim
Joachim Dürr Softwareengineering
https://www.jd-engineering.de
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
Beiträge: 2828
Registriert: Fr, 10. Feb 2006 9:51
Wohnort: Aachen
Hat sich bedankt: 259 Mal
Danksagung erhalten: 12 Mal
Kontaktdaten:

Re: Milli-Sekunden bestimmen... [ERLEDIGT]

Beitrag von UliTs »

Hallo Joachim,

ich bin gerade mal wieder hierübergestolpert und habe Deinen Vorschlag umgesetzt und getestet:

Code: Alles auswählen

select timestampdiff(SQL_TSI_FRAC_SECOND,cast(curdate() as SQL_TIMESTAMP),now()) MilliSekunden 
from   system.iota
Klappt wunderbar :D .
Danke
-------
Mitglied XuG Cologne
Mitglied XuG Osnabrück
Antworten