Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   proprietäres Datumsformat in DB-Tabelle analysieren (https://www.delphipraxis.net/194855-proprietaeres-datumsformat-db-tabelle-analysieren.html)

himitsu 16. Jan 2018 14:48

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Zitat:

Zitat von jobo (Beitrag 1391090)
Ja, aber dann zufällig in einem String Typ gespeichert?

In was denn sonst?

BLOBs kennt doch kein Schwein.
Viele kennen eben nur Integer, String und Float. :zwinker:

Uwe Raabe 16. Jan 2018 15:27

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Zitat:

Zitat von himitsu (Beitrag 1391088)
Delphi-Quellcode:
TMyDate = record Date, Time: Integer; end;

Sowas gibt's doch schon in System.SysUtils:
Delphi-Quellcode:
  TTimeStamp = record
    Time: Integer;     { Number of milliseconds since midnight }
    Date: Integer;     { One plus number of days since 1/1/0001 }
  end;
Eine simple Umwandlung (ohne Fehlerkontrolle) könnte in einem aktuellen Delphi etwa so aussehen:
Delphi-Quellcode:
var
  arr: TArray<string>;
  timeStamp: TTimeStamp;
  dateTime: TDateTime;
  S: string;
begin
  S := '000B3DC6h0147DE2Ch';
  arr := S.Split(['h']);
  timeStamp.Date := Integer.Parse('$' + arr[0]);
  timeStamp.Time := Integer.Parse('$' + arr[1]);
  dateTime := TimeStampToDateTime(timeStamp);
end;

Ghostwalker 16. Jan 2018 15:30

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Da lob ich mir doch einen einfachen Int64 (BigInt) und gut.:dancer:

Sherlock 16. Jan 2018 15:42

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Zitat:

Zitat von Ghostwalker (Beitrag 1391097)
Da lob ich mir doch einen einfachen Int64 (BigInt) und gut.:dancer:

In der Tat kommt man da auch mit Millisekunden seit Jahr 0 gut zurecht...sofern man Christ ist. Auch als Hebräer hat man keine Probleme, wehe aber man rechnet das Jahr 0 als Zeitpunkt des Big Bang ;)

Sherlock

himitsu 16. Jan 2018 15:51

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Jetzt wo du es sagst, mal schnell nachgesehn, ob meine beschriebene Berechnung stimmt.
Delphi-Quellcode:
function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
asm
{$IFDEF ALIGN_STACK}
        SUB   ESP, 4
{$ENDIF ALIGN_STACK}
        PUSH   EBX
{$IFDEF PIC}
        PUSH   EAX
        CALL   GetGOT
        MOV    EBX,EAX
        POP    EAX
{$ELSE !PIC}
        XOR    EBX,EBX
{$ENDIF !PIC}
        PUSH   EAX
        CALL   ValidateTimeStamp
        POP    EAX
        MOV    ECX,[EAX].TTimeStamp.Time
        MOV    EAX,[EAX].TTimeStamp.Date
        SUB    EAX,DateDelta
        IMUL   [EBX].IMSecsPerDay
        OR     EDX,EDX
        JNS    @@1
        SUB    EAX,ECX
        SBB    EDX,0
        JMP    @@2
@@1:   ADD    EAX,ECX
        ADC    EDX,0
@@2:   PUSH   EDX
        PUSH   EAX
        FILD   QWORD PTR [ESP]
        FDIV   [EBX].FMSecsPerDay
        ADD    ESP,8
        POP    EBX
{$IFDEF ALIGN_STACK}
        ADD   ESP, 4
{$ENDIF ALIGN_STACK}
end;
Aua, wozu muß das unbedingt in Assembler sein (XE),
wenn auch sowas reicht?
Delphi-Quellcode:
function TimeStampToDateTime(const TimeStamp: TTimeStamp): TDateTime;
begin
  ValidateTimeStamp(TimeStamp);
  Result := TimeStamp.Time / MSecsPerDay + TimeStamp.Data - DateDelta;
end;

// Mein Vorschlag sagte zwar
// Result := TimeStamp.Data - DateDelta + TimeStamp.Time / MSecsPerDay;
// aber ohne Zwischenvariable für die Division isses bestimmt besser.
Integer.Parse: StrToInt in alten Delphis.

Ghostwalker 16. Jan 2018 15:59

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Zitat:

Zitat von Sherlock (Beitrag 1391099)
Zitat:

Zitat von Ghostwalker (Beitrag 1391097)
Da lob ich mir doch einen einfachen Int64 (BigInt) und gut.:dancer:

In der Tat kommt man da auch mit Millisekunden seit Jahr 0 gut zurecht...sofern man Christ ist. Auch als Hebräer hat man keine Probleme, wehe aber man rechnet das Jahr 0 als Zeitpunkt des Big Bang ;)

Sherlock

Naja..also bei den meisten Anwendungen braucht man keine Millisekunden. Da reichen Sekunden. Also ein simpler Unixtimestamp :) Int64 wg. des 2038'er Problems.

Und wer ein Datum bzw. eine Zeitangabe vor dem BigBang braucht hat imho einen klitzekleinen Denkfehler (aber wirklich nur ein kleiner :) )

Uwe Raabe 16. Jan 2018 16:11

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Zitat:

Zitat von Ghostwalker (Beitrag 1391102)
Und wer ein Datum bzw. eine Zeitangabe vor dem BigBang braucht hat imho einen klitzekleinen Denkfehler (aber wirklich nur ein kleiner :) )

Das ist gar nicht so sicher:
Zurück vor den Urknall. Die ganze Geschichte des Universums
Was war vor dem Urknall?

Rollo62 17. Jan 2018 06:28

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Man sich viele Theorien vor dem BigBang überlegen,
nur praktisch ist das Alles ausserhalb der realen Physik.
Womöglich gibt es davor gar keine "Zeit" oder etwas Anderes analoges, was wir niemals sehen werden.
Also ich stimme auch eher dafür das t0 erstmal so definiert bleibt wie es war :stupid:

Ghostwalker 17. Jan 2018 07:54

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Zitat:

Zitat von Uwe Raabe (Beitrag 1391105)
Zitat:

Zitat von Ghostwalker (Beitrag 1391102)
Und wer ein Datum bzw. eine Zeitangabe vor dem BigBang braucht hat imho einen klitzekleinen Denkfehler (aber wirklich nur ein kleiner :) )

Das ist gar nicht so sicher:
Zurück vor den Urknall. Die ganze Geschichte des Universums
Was war vor dem Urknall?

Ok, auch Einstein's Relativitäts-Theorie wird schon angezweifelt. Aber für den Otto-Normal-Menschen hat das doch eher wenig Auswirkungen :)

jobo 17. Jan 2018 07:57

AW: proprietäres Datumsformat in DB-Tabelle analysieren
 
Zitat:

Zitat von himitsu (Beitrag 1391091)
In was denn sonst?

Naja, ich hab mal davon gehört das die gesamte EDV sich irgendwie binär abbilden lässt. :stupid: Das gilt dann u.a. auch für Strings, naheliegender Weise aber auch für Ganzzahlen und andere Zahlen.
Ein Zahlentyp zur Datumsspeicherung zu verwenden wäre auch bei der Herleitung aus
Delphi-Quellcode:
TMyDate = record Date, Time: Integer; end;
nicht ganz an den Haaren herbeigezogen.
:wink:


Alle Zeitangaben in WEZ +1. Es ist jetzt 04:43 Uhr.
Seite 2 von 2     12   

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz