AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Programmieren allgemein proprietäres Datumsformat in DB-Tabelle analysieren

proprietäres Datumsformat in DB-Tabelle analysieren

Ein Thema von Sharky · begonnen am 16. Jan 2018 · letzter Beitrag vom 17. Jan 2018
Antwort Antwort
Seite 1 von 2  1 2   
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.248 Beiträge
 
Delphi 2006 Professional
 
#1

proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 14:14
Hai ihr,

ich habe hier auf einem MS-SQL-Server eine Tabelle mit Einträgen aus der Software einer Drittfirma.
Zu dieser Habe ich keine keinerlei Kontakt oder eine Chance an die Ranzukommen.

In ihrer Tabelle speichern die Date/Time Werte in einer char(20) Feld.

zum Beispiel steht dort:

000B3DC6h0147DE2Ch

Aus dem Frondend weiss ich das dies "16.01.2018 05:58:07"

Kann einer von euch hier ein System erkennen?

000B3DC6 -> Muss wohl das Datum sein da es bei allen Einträgen von heute gleich ist.
0147DE - > Könnte Stunde und Minute zu sein

Gruß
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.557 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 14:27
Der Datumsanteil scheint die Tage seit dem Jahr 1 zu zählen . Quelle für die Vermutung: https://www.epochconverter.com/seconds-days-since-y0

Der Zeitanteil sind die Millisekunden seit 0 Uhr.

Sherlock
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann

Geändert von Sherlock (16. Jan 2018 um 14:36 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.959 Beiträge
 
Delphi 10.4 Sydney
 
#3

AW: proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 14:50
Jupp, sind erstmal zwei Integer Cardinal
000B3DC6h 0147DE2Ch

000B 3DC6 = 736.710 Tage seit 01.01.0001 = 16.01.2018

((05 * 60 + 58) * 60 + 07) * 1000 = 21.487.000
0147 DE2C = 21.487.148

also genau 16.01.2018 05:58:07.148


Unit SysUtils
Delphi-Quellcode:
{ Units of time }

  HoursPerDay = 24;
  MinsPerHour = 60;
  SecsPerMin = 60;
  MSecsPerSec = 1000;
  MinsPerDay = HoursPerDay * MinsPerHour;
  SecsPerDay = MinsPerDay * SecsPerMin;
  SecsPerHour = SecsPerMin * MinsPerHour;
  MSecsPerDay = SecsPerDay * MSecsPerSec;

{ Days between 1/1/0001 and 12/31/1899 }

  DateDelta = 693594;
Von Wert 1 das DateDelta abziehen,
Wert 2 durch MSecsPerDay teilen,
beides addieren
und schon hast du ein TDateTime.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (16. Jan 2018 um 14:56 Uhr)
  Mit Zitat antworten Zitat
Benutzerbild von Sharky
Sharky

Registriert seit: 29. Mai 2002
Ort: Frankfurt
8.248 Beiträge
 
Delphi 2006 Professional
 
#4

AW: proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 14:52




Danke euch beiden. DA wäre ich nicht drauf gekommen.
Stephan B.
"Lasst den Gänsen ihre Füßchen"
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.959 Beiträge
 
Delphi 10.4 Sydney
 
#5

AW: proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 14:59
Hab noch die Umrechnung nachgetragen.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.313 Beiträge
 
Delphi 11 Alexandria
 
#6

AW: proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 15:01
In ihrer Tabelle speichern die Date/Time Werte in einer char(20) Feld.
*Boah eyh*
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
Benutzerbild von Sherlock
Sherlock

Registriert seit: 10. Jan 2006
Ort: Offenbach
3.557 Beiträge
 
Delphi 10.4 Sydney
 
#7

AW: proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 15:05
Danke euch beiden. DA wäre ich nicht drauf gekommen.
Das glaube ich nicht, Du hattest nur grad keine Langeweile

Vom Ansatz her mußten erst die Hexen ins Dezimalsystem konvertiert werden. Ich habe mit dem Datumsanteil angefangen, erhaltene Zahl war zu klein für "Sekunden seit" und zu groß für Tage seit 1900 oder gar 1970. Dann blieb eigentlich nur noch Tage seit 0 (der mysql-Referenzpunkt). Google spuckte für die Suche "736710 days since 0" die von mir verlinkte Seite aus, und darin ist der "seit dem Jahr 1" Referenzpunkt zu finden.
Die Zeit war dann einfach: Das gibt sogar Google selbst her, wenn man annimmt, daß die recht große Zahl Millisekunden sein könnten führt folgende Suche zum Ziel: "21487148 milliseconds to hours". Da sieht man dann die von Dir angegebene 5, und der Rest ist dann ein Klacks. Wie Du also siehst, mit Langeweile, oder meinetewegen Prokrastination kommt man zum Ziel. Nur mein eigenes Ziel ist wieder etwas weiter in die Ferne gerückt... *Seufz*

Sherlock
Geändert von Sherlock (Morgen um 16:78 Uhr) Grund: Weil ich es kann
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.978 Beiträge
 
Delphi 2010 Enterprise
 
#8

AW: proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 15:16
In ihrer Tabelle speichern die Date/Time Werte in einer char(20) Feld.
*Boah eyh*
Tja, vermutlich obfuscation oder "historisch gewachsen" aus einer Entwicklung nach Kundenwunsch.
Es ist (oder war) ja offenbar beliebt, Datumse, Rechnungsnummer, Teile. & Artikelnummern unternehmensspezifisch mit Merkmalen zu versehen, die "mehr" ausgesagt haben für den Kenner.
Die 3. Stelle der Teilenummer war dann "Lager Hamburg Hafen" oder "Lager Bremen", 4 und 5 eine Baureihe usw..
Wenn das irgendwann mal in Lochkarten gestanzt wurde, ist es vermutlich besonders hartnäckig.

Alte RDBMS (vermutlich besonders auch alte mysql Versionen) glänzen ja auch nicht unbedingt durch mächtige Datumsfunktionen auf Datumstypen. Also lieber alles zu Fuß und etwas Verschleierung hilft gegen die Konkurrenz (und Forschergeist bei den Kunden selbst).
Gruß, Jo
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
38.959 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 15:25
Zitat:
Tja, vermutlich obfuscation oder "historisch gewachsen" aus einer Entwicklung nach Kundenwunsch.
Ich vermute billiger: es ist einfach nur der Datumstyp (Record) nach binär umgewandelt.
TMyDate = record Date, Time: Integer; end;


Jupp, im Prinzip gibt es ja mehrere Möglichkeiten, die es hätten sein können.

* es ist ein Record, also die Stunden, Minuten, Sekunden, Tage, Monat und Jahr liegen in eigenen Bytes/Words.
** das könnte auch mathematisch gelöst sein, also z.B. jeweils mit 100 Multipiziert und aneinander gehängt (beim Byte-Record quasi mit 256 multipliziert)
* es sind zwei Integer (2x 4 Byte)
* es ist ein 64 Bit Integer
* es ist was gemischtes ala z.B. ein 5 Byte und ein 3 Byte Wert

Record und die 2-Byte sind am wahrscheinlichsten, was auch deine Beobachtung mit dem gleichen Datumsanteil bestätigten.
Also erstmal die Teile nach Dezimal umwandeln die größe des Wertes mit bekannten Datumsformaten vergleichen. siehe die Ausführung von Sherlock.

Beim Datumsteil kann man da auch einfach erstmal die Datumsanteile der Größe nach zusammenrechnen, bis man etwa auf den Zielwert kommt.
Ohne Millsekunden ist es ims 1000-fache (3 Dezimalstellen) zu groß und für Nanosekunden fehlt noch bissl was.
Aber die 1000 entsprechen zufällig den Millisekunden.


Falls man die Möglichkeit hat, kann man im Programm sich auch noch ein paar Vergleichswerte mit Tagesanfang 00:00:00, Halbtags 12:00:00 und Halbzeit 12:30:30,
sowie Jahresanfang 01.01.2000, ein Vergleichstag 02.01.2000 und ein Vergleichsjahr 01.01.2010 erstellen.
Die Differenzwerte besagen dann für Wert 1 = 1 pro Tag und bei Wert zwei 1000 pro Sekunde. (bei deinem Zielformat)

Oder in der Datenbank einfach mal eine 0 (00000000h00000000h) einstellen schauen was das Programm anzeigt, bzw. auch für 00000000h0147DE2Ch und 000B3DC6h00000000h.
Bei Letzterem siehst dann, ob die beiden Werte wirklich nur für Datum und Uhrzeit stehen oder ob es sich überlappt.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
Delphi-Tage 2005-2014

Geändert von himitsu (16. Jan 2018 um 15:35 Uhr)
  Mit Zitat antworten Zitat
jobo

Registriert seit: 29. Nov 2010
2.978 Beiträge
 
Delphi 2010 Enterprise
 
#10

AW: proprietäres Datumsformat in DB-Tabelle analysieren

  Alt 16. Jan 2018, 15:45
Zitat:
Tja, vermutlich obfuscation oder "historisch gewachsen" aus einer Entwicklung nach Kundenwunsch.
Ich vermute billiger: es ist einfach nur der Datumstyp (Record) nach binär umgewandelt.
TMyDate = record Date, Time: Integer; end;
Ja, aber dann zufällig in einem String Typ gespeichert?
Gruß, Jo
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 06:17 Uhr.
Powered by vBulletin® Copyright ©2000 - 2022, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2021 by Daniel R. Wolf