Timestamp in Datum konvertieren

Hallo,

möchte aus einer ACCESS Datenbank in der ein Feld vom Typ DATETIME enthalten ist, dies in ein lesbares Datum konvertieren.

Das Feld enthält nur ganze Zahlen. So soll der Wert 727300193 das Datum 25.10.2001 "23:03:02 ergeben. Das erkennen ich aus der Anwendung der Datenbank. Es ist aber mit Sicherheit kein Unix Timestamp.

Hat jemand eine Idee, wie man dies konvertieren kann?

Danke.

Gruß
Gunter

Hallo,

möchte aus einer ACCESS Datenbank in der ein Feld vom Typ
DATETIME enthalten ist, dies in ein lesbares Datum
konvertieren.

Das Feld enthält nur ganze Zahlen. So soll der Wert 727300193
das Datum 25.10.2001 "23:03:02 ergeben. Das erkennen ich aus
der Anwendung der Datenbank. Es ist aber mit Sicherheit kein
Unix Timestamp.

Hat jemand eine Idee, wie man dies konvertieren kann?

Die Long-Werte, die man da findet sind Sekunden seit … (01.01.1970?) … habe ich mal irgendwo gelesen. Dann könnte man das ja einfach mit DateAdd berechnen.

Ich habe einfach mal von Deinem Datum „25.10.2001 23:03:02“ 727300193 Sekunden abgezogen und bekomme als Startzeitpunkt „09.10.1978 03:13:09“. Da stimmt irgend etwas nicht. Bist Du sicher, daß die Zahlen stimmen?

Der Code noch, mit dem ich gerechnet habe:

Option Explicit

Private Declare Sub CopyMemory Lib "kernel32" Alias "RtlMoveMemory" (pDst As Any, pSrc As Any, ByVal ByteLen As Long)

Private Sub Command1\_Click()
 Dim tm As Long
 Dim t As Date
 t = "25.10.2001 23:03:02"
 tm = -727300193
 t = DateAdd("s", tm, t)
 Text1.Text = CStr(t)
End Sub

Gruß, Rainer

Hallo Rainer,

die Sekunden seit 01.01.1970 ist der Unix Time Stamp, der ist es nicht.

Seltsam ist, dass die Zahl, wie oben genannt:

727300193 das Datum 25.10.2001 23:03:02 ergibt und die Zahl
727300239 das Datum 25.10.2001 23:04:30 ergibt.

Also ein Delta von 46 in der Zahl, ergibt ein Delta in der Uhrzeit von 88 Sekunden. Ich werde daraus nicht schlau!

Gruß
Gunter

Die Long-Werte, die man da findet sind Sekunden seit …
(01.01.1970?) … habe ich mal irgendwo gelesen. Dann könnte
man das ja einfach mit DateAdd berechnen.

Ich habe einfach mal von Deinem Datum „25.10.2001 23:03:02“
727300193 Sekunden abgezogen und bekomme als Startzeitpunkt
„09.10.1978 03:13:09“. Da stimmt irgend etwas nicht. Bist Du
sicher, daß die Zahlen stimmen?

Der Code noch, mit dem ich gerechnet habe:

Option Explicit

Private Declare Sub CopyMemory Lib „kernel32“ Alias
„RtlMoveMemory“ (pDst As Any, pSrc As Any, ByVal ByteLen As
Long)

Private Sub Command1_Click()
Dim tm As Long
Dim t As Date
t = „25.10.2001 23:03:02“
tm = -727300193
t = DateAdd(„s“, tm, t)
Text1.Text = CStr(t)
End Sub

Gruß, Rainer

[MOD] - Tippfehler entfernt.

Hi Gunter,

die Sekunden seit 01.01.1970 ist der Unix Time Stamp, der ist
es nicht.

ach so.

Seltsam ist, dass die Zahl, wie oben genannt:

727300193 das Datum 25.10.2001 23:03:02 ergibt und die Zahl
727300239 das Datum 25.10.2001 23:04:30 ergibt.

Also ein Delta von 246 in der Zahl, ergibt ein Delta in der
Uhrzeit von 88 Sekunden. Ich werde daraus nicht schlau!

Tut mir leid, ich habe auch keine andere Idee.

Gruß, Rainer

möchte aus einer ACCESS Datenbank in der ein Feld vom Typ
DATETIME enthalten ist, dies in ein lesbares Datum
konvertieren.
Das Feld enthält nur ganze Zahlen. So soll der Wert 727300193
das Datum 25.10.2001 "23:03:02 ergeben. Das erkennen ich aus
der Anwendung der Datenbank. Es ist aber mit Sicherheit kein
Unix Timestamp.
Hat jemand eine Idee, wie man dies konvertieren kann?

Hi Gunter,
Ideen habe ich reichlich, ob sie dir weiterhelfen ist was anderes :smile:

Option Explicit

Public Function VB_CTime(ByVal dblSec As Double) As Variant
VB_CTime = DateAdd(„s“, dblSec, „9.10.1978 03:13:09“)
End Function

Sub tt()
MsgBox CDate(VB_CTime(727300193))
End Sub

Und frach mich bitte nich was so am 9.10.1978 um 03:13:09 Uhr so los war *gg*

Gruß
Reinhard

Hallo Reinhard,

auf die Art und Weise habe ich es auch schon versucht, das passt leider nur für den Wert 727300193,
für 727300239 kommt damit 25.10.2001 23:03:48 heraus, richtig wäre aber 23:04:30. Irgendwie ist das nicht linear.

Gruß
Gunter

Hi Gunter,
Ideen habe ich reichlich, ob sie dir weiterhelfen ist was
anderes :smile:

Option Explicit

Public Function VB_CTime(ByVal dblSec As Double) As Variant
VB_CTime = DateAdd(„s“, dblSec, „9.10.1978 03:13:09“)
End Function

Sub tt()
MsgBox CDate(VB_CTime(727300193))
End Sub

Und frach mich bitte nich was so am 9.10.1978 um 03:13:09 Uhr
so los war *gg*

Gruß
Reinhard

Hallo, Gunter!

auf die Art und Weise habe ich es auch schon versucht, das
passt leider nur für den Wert 727300193,
für 727300239 kommt damit 25.10.2001 23:03:48 heraus, richtig
wäre aber 23:04:30. Irgendwie ist das nicht linear.

Irgendwie würde ich eher vermuten bis behaupten, dass Deine Datenbankanwendung da eigene Umwandlungen draus macht, so dass Du Datums- und Zeitwerte siehst.

Welches Access hast Du denn? Wenn ich bei meinen Versionen (bis incl. 2003) Felder vom Typ Zeit/Datum habe, stehen in der Tabelle auch immer gescheite Datumswerte drin. Bestenfalls habe ich eine komische Formatierung bei der Ausgabe des Feldes, aber wenn ich die rausnehme, kommen saubere Daten bei raus.

Gruß, Manfred

Hi Gunter,

auf die Art und Weise habe ich es auch schon versucht, das
passt leider nur für den Wert 727300193,
für 727300239 kommt damit 25.10.2001 23:03:48 heraus, richtig
wäre aber 23:04:30. Irgendwie ist das nicht linear.

nicht getestet, aber dachte mir das schon.

"So soll der Wert 727300193 das Datum 25.10.2001 „23:03:02 ergeben. Das erkennen ich aus der Anwendung der Datenbank.“

Kann man da mal dranrum kratzen, der eigentliche Zellinhalt ist „727300193“ aber angezeigt wird durch Access: „25.10.2001 23:03:48“ ? Ist das so?

Vielleicht ist da ja was falsch, weil in der Inet-Recherche stieß ihc immer nur auf das Startdatum und 727300193 sind Sekunden die dazu addiert werden und komme damit nicht auf 25.10.2001 23:03:02
Was ist mit Anwendung der Datenbank gemeint?

Gruß
Reinhard

Hallo Reinhard, hallo Manfred,

bei dem Programm, das diese Datenbank erzeugt, handelt es sich um ein Musik Verwaltungsprogramm (MP3 usw.) Names ‚Helium‘. In diesem Programm wird auch das Erstellungsdatum der Datei in die Datenbank geschrieben. Es ist identisch mit dem Datum das im Dateiexplorer zu sehen ist.
Inzwischen habe ich von den Entwicklern des Programms folgende Antwort erhalten:

The field is of the type DATETIME which is used to store timestamps in Access databases, you can find information about this by searching on Google.

A little example:

SELECT Format([file_timestamp], „dddd mmmm yyyy“) FROM tblDetail

Bloss hat mich das auch nicht weiter gebracht.

Gruß
Gunter

Hallo Manfred,

siehe mein eAntwort Re4 an Reiner.

Gruß
Gunter

Hallo Gunter,

soweit ich weiss gibt es nur den Unix Timestamp. Access selbst hat keinen. Aber da kann ich mich auch irren!
Aber wenn du schon die DB hast. Lege einfach mal jede Sekunde einen neuen Datensatz an! Wie schauen dann die Timestamp’s aus ?
Einfach mal 61 Datensaetze posten und dir dann die Daten anschauen und hier mal gegebenfalls posten. Vielleicht finden wir da den Algorithmus :smile:

MfG Alex

Hallo, Gunter!

bei dem Programm, das diese Datenbank erzeugt, handelt es sich
um ein Musik Verwaltungsprogramm (MP3 usw.) Names ‚Helium‘.

Da haben Leute zu viel von geraucht:wink:

The field is of the type DATETIME which is used to store
timestamps in Access databases, you can find information about
this by searching on Google.
A little example:
SELECT Format([file_timestamp], „dddd mmmm yyyy“) FROM
tblDetail

Soso. Format „dddd mmmm yyyy“ soll die Uhrzeit mit angeben? I have my doubts, mylord.

Gut, probier das mal aus: Mache Dir eine neue Abfrage, die wie obige aussieht. Tabellen- und Feldnamen musst Du ggf. anpassen, aber wenn die Entwickler das so schreiben, könnte das schon passen.
Oder nimm als Formatstring „tt.mm.jjjj hh:nn:ss“.

Dennoch: Access zeigt in der normalen Tabellenansicht Datum/Uhrzeit-Felder eigentlich sauber an, ohne dass man was verrenken muss…

Gruß, Manfred

Hallo Manfred,

habe es mal mit format „dddd mmmm yyyy“ versucht, da geht gar nichts.
Dann mit deinem Vorschlag „tt.mm.jjjj hh:nn:ss“, damit sieht das Ergebnis so aus:

tt690643281,mm.jjjj hh:nn:ss

Gruß
Gunter

The field is of the type DATETIME which is used to store
timestamps in Access databases, you can find information about
this by searching on Google.
A little example:
SELECT Format([file_timestamp], „dddd mmmm yyyy“) FROM
tblDetail

Soso. Format „dddd mmmm yyyy“ soll die Uhrzeit mit angeben? I
have my doubts, mylord.

Gut, probier das mal aus: Mache Dir eine neue Abfrage, die wie
obige aussieht. Tabellen- und Feldnamen musst Du ggf.
anpassen, aber wenn die Entwickler das so schreiben, könnte
das schon passen.
Oder nimm als Formatstring „tt.mm.jjjj hh:nn:ss“.

Dennoch: Access zeigt in der normalen Tabellenansicht
Datum/Uhrzeit-Felder eigentlich sauber an, ohne dass man was
verrenken muss…

Gruß, Manfred

Hallo, Gunter!

Da ist was völlig murks. Schick mal die Access-Datenbank gezippt vorbei, dann kann man mal schauen…

Gruß, Manfred

Hallo Manfred,

Mail ist unterwegs.

Gruß
Gunter

Hi Gunter,

auf die Art und Weise habe ich es auch schon versucht, das
passt leider nur für den Wert 727300193,
für 727300239 kommt damit 25.10.2001 23:03:48 heraus, richtig
wäre aber 23:04:30. Irgendwie ist das nicht linear.

Also da machen die Entwickler irgend einen Murks.

  1. Das Tabellenfeld ist vom Typ Zahl/Long Integer.
  2. Du schreibst:
    727300193 heißt 25.10.2001 23:03:02
    727300239 heißt 25.10.2001 23:04:30
    Ergibt: Die Differenz der Zahlen ist 46, die Differenz der Zeiten ist 88 Sekunden.
  3. Daraus ergibt sich nix gescheites. Jedenfalls nichts auf den ersten Blick.
  4. Wie Du selbst festgestellt hast, ist der Versuch der Formatierung, den die Entwickler vorgeschlagen haben, für Access Humbug.

Entweder machen die Jungs noch etwas mit den Zahlen. In jedem Fall verwenden sie dann andere Konvertierungsalgorithmen als die, die in Access üblich sind. Oder Du hast eine andere Zahl rausgesucht und den falschen Wert für Datum/Zeit abgelesen. In diesem Fall sollte die „Umrechnung“ von Reinhard, die schon versucht wurde, funktionieren.

Aber wenn ich so weiter schaue: in tblAlbums taucht ein Feld AddedDate auf. Das ist ein Datum. In tblVolumes gibt’s Felder CreateDate und CreateTime. Die sehen mit aus nach Zahlen, die im Format yyyymmdd bzw. hhmmss vorhanden sind, also berechnet als Jahr*10000+Monat*100+Tag bzw. Stunden*10000+Minuten*100+Sekunden. Und wie man das nun auseinanderfrickelt, um aus EINER Zahl ein Datum und eine Uhrzeit zu holen, wissen wohl echt nur die Entwickler.

Außerdem findet sich noch in tblDetails das Feld „AddedDate“. Ist das vielleicht das Feld, was angezeigt wird? Wenn ich mir nämlich Album_Id=2782 auf Volume_Id=6 anschaue, finde ich ein konstantes AddedDate 18.03.2008 08:26:11 mit den fortlaufenden file_timestamp 673251328, 673251329 und 673251330.

Gruß, Manfred

Hallo,

habe inzwischen durch intensive Vergleiche einzelner Daten den Algorithmus, wie das Datum umgerechnet wird, gefunden.

Für den den es interessiert hier das Coding dazu:

Public Function VB_Datum(ByVal dblSec As Double) As Variant

Dim vStart As Variant
Dim Jahre As Variant
Dim Monate As Variant
Dim Tage As Variant
Dim Rest As Variant
Dim Stunden As Variant
Dim Minuten As Variant
Dim Sekunden As Variant
Dim Datum As Variant

On Error Resume Next

vStart = DateSerial(1980, 1, 1) ’ Bezugsdatum 1.1.1980
’ unter Windows ist kein älters Datum zulässig

Jahre = dblSec \ 33554432 ’ 2^25
Rest = dblSec Mod 33554432

Monate = Rest \ 2097152 ’ 2^21
Rest = Rest Mod 2097152

Tage = Rest \ 65536 ’ 2^16
Rest = Rest Mod 65536

Stunden = Rest \ 2048 ’ 2^11
Rest = Rest Mod 2048

Minuten = Rest \ 32 ’ 2^5
Rest = Rest Mod 32

Sekunden = 2 * Rest ’ 2^1

Datum = DateAdd(„yyyy“, Jahre, vStart)
Datum = DateAdd(„m“, Monate - 1, Datum)
Datum = DateAdd(„d“, Tage - 1, Datum)
Datum = DateAdd(„h“, Stunden, Datum)
Datum = DateAdd(„n“, Minuten, Datum)
VB_Datum = DateAdd(„s“, Sekunden, Datum)

End Function

Gruß
Gunter

[Bei dieser Antwort wurde das Vollzitat nachträglich automatisiert entfernt]