Milli-Sekunden bestimmen... [ERLEDIGT]

Advantage Database Server

Moderator: Moderatoren

Milli-Sekunden bestimmen... [ERLEDIGT]

Beitragvon UliTs » Mo, 03. Jun 2013 14:38

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
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2403
Registriert: Fr, 10. Feb 2006 10:51
Wohnort: Aachen

Re: Milli-Sekunden bestimmen...

Beitragvon georg » Mo, 03. Jun 2013 15:28

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/1695288/getting-the-current-time-in-milliseconds-from-the-system-clock-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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1848
Registriert: Fr, 08. Feb 2008 22:29

Re: Milli-Sekunden bestimmen...

Beitragvon brandelh » Mo, 03. Jun 2013 15:29

int(seconds() * 1000) liefert Millisekunden, wobei die Genauigkeit nur 1/100 Sekunde beträgt.
Gruß
Hubert
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13497
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: Milli-Sekunden bestimmen...

Beitragvon georg » Mo, 03. Jun 2013 15:36

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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1848
Registriert: Fr, 08. Feb 2008 22:29

Re: Milli-Sekunden bestimmen...

Beitragvon brandelh » Mo, 03. Jun 2013 15:45

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13497
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: Milli-Sekunden bestimmen...

Beitragvon UliTs » Mo, 03. Jun 2013 15:46

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
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2403
Registriert: Fr, 10. Feb 2006 10:51
Wohnort: Aachen

Re: Milli-Sekunden bestimmen...

Beitragvon brandelh » Mo, 03. Jun 2013 15:57

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13497
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: Milli-Sekunden bestimmen...

Beitragvon UliTs » Mo, 03. Jun 2013 20:03

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
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2403
Registriert: Fr, 10. Feb 2006 10:51
Wohnort: Aachen

Re: Milli-Sekunden bestimmen...

Beitragvon georg » Mo, 03. Jun 2013 20:22

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
georg
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 1848
Registriert: Fr, 08. Feb 2008 22:29

Re: Milli-Sekunden bestimmen...

Beitragvon brandelh » Mo, 03. Jun 2013 23:39

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
Benutzeravatar
brandelh
Foren-Moderator
Foren-Moderator
 
Beiträge: 13497
Registriert: Mo, 23. Jan 2006 21:54
Wohnort: Germersheim

Re: Milli-Sekunden bestimmen...

Beitragvon UliTs » Di, 04. Jun 2013 0:15

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
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2403
Registriert: Fr, 10. Feb 2006 10:51
Wohnort: Aachen

Re: Milli-Sekunden bestimmen...

Beitragvon AUGE_OHR » Di, 04. Jun 2013 0:21

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
Benutzeravatar
AUGE_OHR
Marvin
Marvin
 
Beiträge: 10315
Registriert: Do, 16. Mär 2006 8:55
Wohnort: Hamburg

Re: Milli-Sekunden bestimmen...

Beitragvon UliTs » Di, 04. Jun 2013 1:10

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
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2403
Registriert: Fr, 10. Feb 2006 10:51
Wohnort: Aachen

Re: Milli-Sekunden bestimmen...

Beitragvon nightcrawler » Mi, 12. Jun 2013 16:23

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
Benutzeravatar
nightcrawler
Rekursionen-Architekt
Rekursionen-Architekt
 
Beiträge: 263
Registriert: Di, 24. Apr 2012 16:33
Wohnort: 72181 Starzach

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

Beitragvon UliTs » So, 09. Okt 2016 22:23

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
UliTs
Der Entwickler von "Deep Thought"
Der Entwickler von "Deep Thought"
 
Beiträge: 2403
Registriert: Fr, 10. Feb 2006 10:51
Wohnort: Aachen


Zurück zu ADS

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 1 Gast