Seite 1 von 1

Milli-Sekunden bestimmen... [ERLEDIGT]

Verfasst: Mo, 03. Jun 2013 14:38
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

Re: Milli-Sekunden bestimmen...

Verfasst: Mo, 03. Jun 2013 15:28
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.

Re: Milli-Sekunden bestimmen...

Verfasst: Mo, 03. Jun 2013 15:29
von brandelh
int(seconds() * 1000) liefert Millisekunden, wobei die Genauigkeit nur 1/100 Sekunde beträgt.

Re: Milli-Sekunden bestimmen...

Verfasst: Mo, 03. Jun 2013 15:36
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.

Re: Milli-Sekunden bestimmen...

Verfasst: Mo, 03. Jun 2013 15:45
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

Re: Milli-Sekunden bestimmen...

Verfasst: Mo, 03. Jun 2013 15:46
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:

Re: Milli-Sekunden bestimmen...

Verfasst: Mo, 03. Jun 2013 15:57
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.

Re: Milli-Sekunden bestimmen...

Verfasst: Mo, 03. Jun 2013 20:03
von UliTs
Ja, Hubert.
Leider bekomme ich es nicht hin, den Wert in einen integer Wert umzuwandeln.
Das ist mein Problem.

Uli

Re: Milli-Sekunden bestimmen...

Verfasst: Mo, 03. Jun 2013 20:22
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.

Re: Milli-Sekunden bestimmen...

Verfasst: Mo, 03. Jun 2013 23:39
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 ...)

Re: Milli-Sekunden bestimmen...

Verfasst: Di, 04. Jun 2013 0:15
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

Re: Milli-Sekunden bestimmen...

Verfasst: Di, 04. Jun 2013 0:21
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’);

Re: Milli-Sekunden bestimmen...

Verfasst: Di, 04. Jun 2013 1:10
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

Re: Milli-Sekunden bestimmen...

Verfasst: Mi, 12. Jun 2013 16:23
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())

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

Verfasst: So, 09. Okt 2016 22:23
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