Laden...

[erledigt] Pervasive-Datenbank: Umwandlung von Int32 in DateTime

Erstellt von Taipi88 vor 13 Jahren Letzter Beitrag vor 13 Jahren 3.294 Views
Taipi88 Themenstarter:in
1.029 Beiträge seit 2010
vor 13 Jahren
[erledigt] Pervasive-Datenbank: Umwandlung von Int32 in DateTime

Hallo Ihr Lieben,

ich habe gerade mal ein Problem...

Folgendes:
Von unserem "alten" Warenwirtschaftssystemhersteller habe ich gestern einen
Albtraum von Datenexport bekommen. <Pervasive SQL 9, BTrieve V 9.5>

Nachdem ich mich mühsam durch Tabellen- und Spalten gekämpft habe, von
denen sich keine eine (namenstechnisch) an kompatible Standards hält habe ich
nun folgendes Problem, worauf ich mir so gar keinen Reim machen kann.

Und zwar gibt es in der Pervasive-DB (anscheinend) keinen Date/DateTime-Datentyp - anstelle von sauberen Daten habe ich hier jedesmal einfach einen Int32 stehen.

Ich wüsste gerne ob und vor allem wie man das konvertieren kann - ich kann mir
nämlich keinen Reim drauf machen.

Versucht habe ich es schon mit:
Convert.ToDateTime(int value);
DateTime.Parse(value.ToString());

Zudem habe ich noch geprüft ob der int vielleicht den Ticks entspricht - Leider auch nicht 😦

Die Daten sehen folgendermaßen aus:
DB-Spalte Übersetzung
733030 20.12.2007
733738 27.11.2009
………… …………………

Das Ganze wird zwar so oder so sehr ungemütlich (Die 'Datumswerte' gibt's in nahezu jeder Tabelle gleich mehrfach) - aber vorerst würde mich einfach mal
interessieren, wie man sowas umwandeln kann...

Ich wäre ziemlich happy wenn dazu jemand eine gute Idee hat !

Grüße

Achim

EDIT: Sry - ich hoffe so passt es besser - bin mir leider (bis jetzt) nicht bewusst wie ich das Problem kurz umreissen soll 😦

1.552 Beiträge seit 2010
vor 13 Jahren

Hallo Taipi88,

komisches Datumformat, ja. Ist mir bis jetzt auch noch nicht über den Weg geloffen.
Als erstes dachte ich mir es wär vielleicht die Excel Darstellung des Datums, aber dann wär der 733030 der 19.12.3906
Eine Frage habe ich jedoch: ist der Integer und das Datum in einer Spalte oder sind dies 2 verschiedene.

Von unserem "alten" Warenwirtschaftssystemhersteller habe ich gestern einen Warum fragst du nicht bei ihm nach wie das Datum bei ihm "interpretiert" wird?

Gruß
Michael

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

3.430 Beiträge seit 2007
vor 13 Jahren

Hallo Taipi88,

das sind die Tage seit dem Datum 1.1.0000

733030 = 20.12.2007
733042 = 01.01.2008

Wenn man das dann durch 365 teilt dann kommt man auf 2008,33
Was den Jahren entspricht.

Die kleine Abweichung wird durch die Schaltjahre verursacht.

Gruß
Michael

Taipi88 Themenstarter:in
1.029 Beiträge seit 2010
vor 13 Jahren

Hallo,

zuerst einmal vielen Dank für die Antwort !

Leider steht (in der Datenbank) nur der Integer - das entsprechende Datum habe ich aus dem dazugehörigen WWS (welches wir allerdings nicht mehr lange haben)

Dummerweise hat der Mann vor meiner Zeit an WWS geliefert, was nicht kann was meiner Chefin in Lasten- und Pflichtenheft zugesichert wurde (Mehrbenutzerfähigkeit z.B. nicht gegeben)

Nach ca. 2 Jahren "herumbessern" ging das Ganze dann zum Anwalt und zum Gericht - von welchem er vorerst dazu verdonnert wurde uns einen Export zu machen.

Der Mann redet somit leider nur mit mir wenn er eine Anordnung dazu bekommt...

ABER:
Ich habe in der Zwischenzeit etwas festgestellt:
Der Integer 1 entspricht dem 01.01.0001 - man muss "einfach" nur hochrechnen 😛

Ok - neue Frage: Gibt es dafür bereits eine Klasse / Funktion die das kann ?
Ich glaube das mit dem Hochrechnen ist bei (sehr sehr vielen) Records doch
echt mächtig zeitaufwändig...

@michlG: Auch dir danke 😃
Was die Rundungsfehler angeht: Leider so nicht wirklich gut - geht dummerweise
auch um die Daten von Rechnungen - bin mir ziemlich sicher da bekomme ich Ärger 😛

Gruß

Achim

Taipi88 Themenstarter:in
1.029 Beiträge seit 2010
vor 13 Jahren

So, hi Ihr Lieben,

erstmal vielen Dank für eure Antworten - tut mir leid, dass ich's erst nicht selbst
gemerkt habe...

Ich schätze ich werde nachfragen müssen was ich nun tun soll - die Umwandlung von
227 Tabellen mit Anzahl Spalten unbekannt würde vermute ich länger dauern als mich
jemand dafür "dranhocken" möchte - Ich soll schließlich die Daten nur 'lesbar' zur Verfügung stellen...

Muss mir somit überlegen, ob es Sinn macht die integers quasi 'on-demand' umzurechnen oder diese komplett in einer neuen spalte abzuspeichern.

Vielen Dank soweit !

Achim

1.552 Beiträge seit 2010
vor 13 Jahren

Och, dass es mit dem 1.1.0001 anfangen könnte ist mir nicht eingefallen. 😁

Was die Rundungsfehler angeht: Leider so nicht wirklich gut - geht dummerweise
auch um die Daten von Rechnungen - bin mir ziemlich sicher da bekomme ich Ärger 😛

Es geht ganz einfach mit folgenden code:

DateTime dt = new DateTime(1,1,1);
dt = dt.AddDays(733030);

Wobei das Result dann der 21.12.2007 und nicht der 20 ist.
Du sagst 01 ist der 01.01.0001, das kann zwar richtig sein, aber du musst aufpassen da die DateTime klasse nicht unter dem 01.01.0001 rechnen kann. Einfach -1 und die Sache hat sich

Gruß

Mein Blog
Meine WPF-Druckbibliothek: auf Wordpress, myCSharp

Taipi88 Themenstarter:in
1.029 Beiträge seit 2010
vor 13 Jahren

Hallo nochmal,

für alle die's interessiert: ich soll nun neue Spalten erzeugen für alle Felder in denen (auf jegliche Art und Weise) Datumswerte stehen...

Damit Ihr alle mal was zu lachen habt...
Mittlerweile habe ich folgende Datumsformate gefunden:

  1. Das mit den Integers (1: 01.01.0001, 20.12.2007 : 733030)
  2. Stringform (20070828 : 28.08.2007)
  3. Stringform (12102007 : 12.10.2007, NULL : NULL, ? : NULL)
  4. Stringform (12/10/2009 : 12.10.2009, ? : NULL)

Achso - auch Zeitwerte kann man so schon verunstalten wie Variante 1 bei Datum:
Geht dann genauso - nur dass man Sekunden verwendet 😜

PS: Für Variante 1 ist ein SQL-Statement der folgenden Art sehr nützlich:

DECLARE	@dbase date = '01.01.1800'
DECLARE @diff int = '657072'
UPDATE 	Taetigkeitsbericht
SET 	TBER_Einsatz_bisD = DATEADD(Day, TBER_Einsatz_bis - @diff, @dbase)
WHERE 	(TBER_Einsatz_bis <> 0)

Liebe Grüße

Achim

PPS: Es fehlen nur noch 12 Tabellen =)