birdy2404
Goto Top

Datum von YYDDDSSSSS in DDMMYYYYhhmmss wandeln

Hallo zusammen,
habe eine Access-2007-Datenbank, in der ich das Fertigungsdatum nach Eingabe des aufgedruckten Fertigungsdatums wie oben genannt umwandeln möchte. D.h.
Eingabe der 10 Ziffern erfolgt im Feld [FD_Motor_org] im Format YYDDDsssss.
Im Feld [FD] soll es nach Aktualisierung dann als DD.MM.YYYY hh:mm:ss abgelegt werden, so dass es jeder lesen kann face-smile
Habe bereits eine Excel-Datei für Umrechnung, allerdings wird es dort als einzelne Felder ausgegeben.

Julianisches FD aufgelöstes Datum
Tag Zeit Datum Zeit (hh mm ss)
12242 18755 29.08.2012 5 12 35

Wobei
A3 ist die Eingabe der 5 Ziffern für den Tag (YYDDD)
B3 ist dei EIngabe der 5 Ziffern für die Zeit in Sekunden (sssss)
C3=DATUM((WENN((0+LINKS(A3;2))<50;2000;1900)+LINKS(A3;2));1;RECHTS(A3;3))
D3=ABRUNDEN(UMWANDELN(B3;"sec";"hr");0)
E3=ABRUNDEN(UMWANDELN(B3-60*60*D3;"sec";"mn");0)
F3=B3-60*60*D3-60*E3

Habe mittlerweile 2 Tage dafür verwendet mich durchzugoogeln und finde keinen Hinweis der mir Verständlich genug ist.
Wäre super wenn mir jemand von Euch helfen könnte.
Merci und Gruß
Andreas

Edit:
Aktuelle Darstellung in Access
316ce56f89f33e321c1b149f7a84ced9
Bild der Excel-Berechnung
8a8f207e32a1e5a1e530743e03695672

Content-Key: 191987

Url: https://administrator.de/contentid/191987

Printed on: April 24, 2024 at 20:04 o'clock

Member: thaenhusen
thaenhusen Sep 28, 2012 at 11:21:41 (UTC)
Goto Top
Moin.

Du kannst den String in VBA zerlegen und dann mittels Dateadd und Modulo Operationen das Datum zusammensetzen.

Das kannst Du direkt im Acces vornehmen ohne irgend welche Rundungen etc.

HTH
MK
Member: MrNetman
MrNetman Sep 28, 2012 updated at 11:42:16 (UTC)
Goto Top
HI Andreas,

Ein Datum im Format YYDDD?
Excel schreibt da als Ausgabe 12Samstag oder wie?
Oder sind es die Tage ab 1. Januar, die gemeint sind?
Und die Sekunden ab 0 Uhr?
Bei den Tagen musst du aufs Schlatjahr achten.
Aber bei einem festen Zahlenformat kannst natürlich mit LINKS und RECHTS arbeiten.
Willst du eine Excel-kompatible Ausgabe oder eine lesbare Darstellung erreichen?

Ausgang -> Ziel
1202407210 -> 24.01.2012 02:00:10
Jahr 12
Tage 024
Sekunden 07210
G3=D3&":"&E3&":"&F3 bringt dir die Uhrzeitanzeige im gewohnten Format
der Rest passt ja schon.
Die Funktion TEXT hilft noch weiter bei der Formatierung.

Gruß
Netman
Member: Birdy2404
Birdy2404 Sep 28, 2012 at 11:42:06 (UTC)
Goto Top
Hi Netman,
die Umrechnung über Excel ist nur das Beispiel wo ich herkomme und dient dem veranschaulichen.
Die Umsetzung soll in Access über VBA ohne Excel erfolgen. Siehe Bilder von oben.
Gruß Andreas
Member: thaenhusen
thaenhusen Sep 28, 2012 updated at 12:21:20 (UTC)
Goto Top
Moin.

Hier etwas Code, der Dir weiterhelfen könnte... (Me.YYDDDSSSSS ist Dein Feld)
Du musst Dich noch um Ausnahmen kümmern!

    Dim YY As Integer
    Dim DDD As Integer
    Dim SSSSS As Integer
    Dim jahr As Integer
    Dim stunden As Integer
    Dim minuten As Integer
    Dim sekunden As Integer
    
    YY = CInt(Mid(Me.YYDDDSSSSS, 1, 2))
    DDD = CInt(Mid(Me.YYDDDSSSSS, 3, 3))
    SSSSS = CInt(Mid(Me.YYDDDSSSSS, 6, 5))
    
    If YY < 50 Then
        jahr = 2000 + YY
    Else
        jahr = 1900 + YY
    End If

    sekunden = SSSSS Mod 60
    minuten = ((SSSSS - sekunden) / 60) Mod 60
    stunden = ((SSSSS - sekunden) / 60) \ 60
    
    MsgBox DateAdd("y", DDD, "01.01." & jahr) & " " & stunden & " " & minuten & " " & sekunden  
Member: Birdy2404
Birdy2404 Sep 28, 2012 at 13:22:07 (UTC)
Goto Top
wunderbar, dankeschön, habe den Code etwas geändert, da er in einen Overflow für SSSSS lief und habe es als Long definiert.
Und im Datum lag er um einen Tag falsch, also habe ich einen Tag abgezogen.
So, nun möchte ich das Ergebnis nicht anzeigen lassen, sondern in das Feld [FD] übertragen. Hatte es bereits mit der letzten Zeile versucht, allerdings bekomme ich einen Laufzeitfehler und die Meldung, dass der Wert für dieses Feld nicht gültig ist

    Dim YY As Integer
    Dim DDD As Integer
    Dim SSSSS As Long
    Dim jahr As Integer
    Dim stunden As Integer
    Dim minuten As Integer
    Dim sekunden As Integer
    
    YY = CInt(Mid(Me.FD_Motor_org, 1, 2))
    DDD = CInt(Mid(Me.FD_Motor_org, 3, 3)) - 1
    SSSSS = CLng(Mid(Me.FD_Motor_org, 6, 5))
    
    If YY < 50 Then
        jahr = 2000 + YY
    Else
        jahr = 1900 + YY
    End If

    sekunden = SSSSS Mod 60
    minuten = ((SSSSS - sekunden) / 60) Mod 60
    stunden = ((SSSSS - sekunden) / 60) \ 60
    
    MsgBox DateAdd("y", DDD, "01.01." & jahr) & " " & stunden & " " & minuten & " " & sekunden  
    Me.FD = DateAdd("y", DDD, "01.01." & jahr) & " " & stunden & " " & minuten & " " & sekunden  
Member: thaenhusen
thaenhusen Sep 28, 2012 updated at 14:12:07 (UTC)
Goto Top
Moin.

Du musst den String noch "kompatibel" machen...

Me.FD = DateAdd("y", DDD, "01.01." & jahr) & " " & Format(stunden, "00") & ":" & Format(minuten, "00") & ":" & Format(sekunden, "00")  

HTH
MK
Member: Birdy2404
Birdy2404 Sep 28, 2012 at 14:50:22 (UTC)
Goto Top
Hat wunderbar funktioniert, vielen herzlichen Dank für die Unterstützung
Member: Biber
Biber Sep 30, 2012 updated at 21:06:13 (UTC)
Goto Top
Moin andreas-san,

willkommen im Forum.

Da du ja den Beitrag noch nicht auf "Gelöst" gesetzt hast, erlaube mir bitte eine Nachfrage,

Du schriebst:
Eingabe der 10 Ziffern erfolgt im Feld [FD_Motor_org] im Format YYDDDsssss.
Im Feld [FD] soll es nach Aktualisierung dann als DD.MM.YYYY hh:mm:ss abgelegt werden, so dass es jeder lesen kann

Da entgleisten mir etwas die Gesichtszüge... weil: zwei Felder mit identischen Informationen (nur unterschiedlich formatiert) in demselben Datensatz...
--> ist nicht gut. Die ersten drei Coddsbrocken , die bei jedem Datenbanker automatisch hochpoppen sind: "Redundanz", "nicht widerspruchsfreie Daten", "Äh bäh"

Um dieses (ja ohnehin errechnete, also aus anderen Infos abgeleitete) hybsch formatierte Feld anzuzeigen, brauchst du es doch nicht abzuspeichern. Ist doch nur eine andere Darstellung des "FD_Motor_org"-Feldes.

Was spricht denn dagegen, es direkt mit dem SELECT-Statement zu erzeugen?
Alles für ein Timestamp-Format der Form "TT.MM.JJJJ hh:mm:ss" hast du doch.

Und mit den ACCESS-SQL-Funktionen DateSerial() und Format() ist es doch kein Hexenwerk.
Dann kannst du die 20 VBA-Zeilen auch einsparen und hast vor allem die Datums/Zeit-Information in EINEM Feld und nicht in zweien.

Grüße
Biber
Member: Birdy2404
Birdy2404 Sep 30, 2012 at 19:25:37 (UTC)
Goto Top
Servus Biber,
hast recht, das hört sich geschickter an.
Die teilweise redundanden Daten verwende ich weil ich dadurch bei einem Excel-Export leichter die Auswertungen fahren kann.
Manchmal werden in dem ursprünglichen Feld noch weitere Informationen wie z.B. die Fertigungslinie und der Prüfstand eingetragen, deshalb ist dann später einfacher bei Problemen eine Rückverfolgung zu machen.
Merci und Gruß
Andreas