Forum

Moderiert von: stefan, spinne
Forum Index
Support
     OPN und andere CMS
     date in OPN?
 

Autor date in OPN?
Gast
Unregistrierter Benutzer
Geschrieben: 15.08.2006 22:49

Hi,
ich bin gerade dabei diverse Datenbestände aus meiner PHPNuke-Installation nach OPN zu migrieren. Dazu mache ich mir diverse Selects, erzeuge mit TOAD for MySQL die Insert-Statements und spiele diese auf der neuen DB ein.

Das geht relativ flott, allerdings stehe ich jetzt von einem Problem:
Das DATE-Format in OPN sieht mir etwas eigenartig aus...
Es ist weder ein aufbereitetes Format, noch ein unix_timestamp - sondern irgendetwas anderes. Ich würde nur ungerne sämtliche Datümer in meiner Datenbank verlieren.

Bitte um einen Tipp, wie ich ein "normales Datum" (z.B. '15.08.2006 21:35:50') in das OPN-Format umwandeln kann. Ich brauche keine fertige Lösung, sondern nur einen Hinweis bzw. die Berechnungsformel. Ich habe mich zwar durch den Code gehantelt, aber bin nicht wirklich schlauer geworden (OPN ist so streng geschachtelt, dass man als Laie sich dauernd im Kreis dreht) - programmiertechnisch ist das natürlich die Wucht (selten sowas gut strukturiertes gesehen).

Einzige Bedingung für den erhofften Vorschlag: Das ganze sollte mit MySQL-Bordmitteln (functions!) machbar sein, sonst kann ich meinen Weg vergessen. Sollte das klappen, kann ich die Scripts nebst einer kurzen Anleitung gerne der Allgemeinheit zur Verfügung stellen.

Danke,
Boby
[addsig]

Zitieren nach oben
xweber
Registriert: 22.08.2001
Beiträge: 1496


Sende eine Private Nachricht an xweber
Geschrieben: 15.08.2006 23:47

in opn benutzen wir ein "eigenes" Datumsformat. Das hat div. Gründe (u.a. sind wir dadurch auch zwischen verschiedenstens SQL Dialekten in der Lage ein Datum zu speichern).

mit einen mysql boardmitteln das nachstellen... hmm... denkbar aber nicht einfach. Die wesentliche Berechnung ist in der opn_date class.

Imho solltest du über ein 2-stufigen import nachdenken. Du lässt dann mit einem php (mini) script dir die aufbereiteten statements erstellen und importierst dann diese.

Alex


Zitieren nach oben
Gast
Unregistrierter Benutzer
Geschrieben: 16.08.2006 00:29

Welche der ca. 200 functions genau meinst Du denn?
Ich hab' mal die 1800 loc über den Schirm flitzen lassen...

Hatte schon die "DaysToDate" in Verdacht, erschien mir dann aber nicht plausibel (was wird da eigentlich alles drin berechnet???).
Dann habe ich mir die vielversprechende Function ConvertDateToDBDate angesehen. Aber dort wird nur mit Unix-Zeitstempel gerechnet.

Bitte noch um "Verfeinerung" des Suchzielgebiets - danke.
Boby
[addsig]

Zitieren nach oben
xweber
Registriert: 22.08.2001
Beiträge: 1496


Sende eine Private Nachricht an xweber
Geschrieben: 16.08.2006 23:15

das Datum (incl. Uhrzeit) wird in eine Zahl umgewandelt.

Links vom Komma ist das Datum (dateToDays)
Rechts vom Komma ist die Uhrzeit (timeToSave)

Mal so aus dem Kopf...

Alex



X.W.E.B.E.R.: eXperimental Worker Engineered for Battle and Efficient Repair

Auch der Mann, der den Berg versetzt hat, hat mit einem kleinen Stein angefangen.

Zitieren nach oben
Gast
Unregistrierter Benutzer
Geschrieben: 20.08.2006 00:17

Mann,
das war echt eine harte Nuss!!!

Die zweistufige Nummer war mir zu aufwändig, denn dann bin ich auch noch in der Skriptprogrammierung drinnen - und das ist mir im Moment etwas zuviel.

Hier mein Code - zur freien Verwendung, für jeden der's haben möchte:
select sid, time as 'time_________',
substr(time,1,2) as century,
substr(time,3,2) as year,
substr(time,6,2) as month,
substr(time,9,2) as day,
substr(time,12,2) as hour,
substr(time,15,2) as minute,
substr(time,18,2) as second,
                /*century*/
floor(146097*(substr(time,1,2))/4)+
                /*year*/
                floor((1461*(case when substr(time,6,2) <= 2
                then substr(time,3,2)-1
                                                             else substr(time,3,2)
                                                  end))/4)+
/*month*/
                floor((153*((case when substr(time,6,2) > 2
                then substr(time,6,2)-3
                                                             else substr(time,6,2)+9
                                                  end))+2)/5)+
                /*day*/
((substr(time,9,2))+1721119) +
                /*time: h,m,s*/
((substr(time,12,2) * 3600) +
(substr(time,15,2) * 60) +
(substr(time,18,2)))/100000 as wdate
from nuke_stories;

Eigentlich ist nur die wdate-Spalte wichtig, der Rest ist nur zur Dokumentation bzw. Kontrolle vorhanden.

Es gab einen Punkt, der mir nicht ganz klar war:
               if ($month>2)
{
                    $month -= 3;
               } else {
                     $month += 9;
                     if ($year) {
                          $year--;
                     }
else {$year = 99;
                          $century--;
                     }
                }

Habe ich das richtig interpretiert? Wenn kein Jahr übergeben wurde, dann nimm' 99 an, falls schon, dann ziehe ein Jahr ab? Falls ja, dann ist es zumindest mir egal - ich habe keine Datümer aus dem alten Millenium.

Ciao,
Boby
[addsig]

[ Diese Nachricht wurde bearbeitet von: Boby am 20.08.2006 00:36 (Originaldatum 20.08.2006 00:17) ]

Zitieren nach oben
sortieren nach

 
Vorheriges Thema:  Welche Sprache in Anypage??
Nächstes Thema:  Verwandschaftgrad von OPN und andern Nuke´s

Gehe zu: