PHP Timestamp (Integer) als Datum in Oracle verwenden
PHP Timestamp (Integer) als Datum in Oracle verwenden
am 27.04.2007 08:21:12 von stefan.d
Hallo und guten Morgen!
Ich bin noch nicht so erfahren mit PHP und muss eine Web-Site
anpassen. Mein Vorgänger hat alle Datums-Werte in PHP als Timestamp
anlegt und die Inhalte in Oracle als einfache Integer gespeichert.
Bisher war das auch kein Problem, da die komplette Eingabe und Anzeige
durch die PHP-Funktionen (mktime etc.) abgedeckt werden konnten.
Nun muss ich aber eine Auswertung in Oracle erstellen, die nach Jahren
gruppiert. Und da kann die Datenbank mit den Zahlen leider nichts
anfangen. Integer kann Oracle leider nicht in das eigene Timestamp-
Format konvertieren und alle Umwandlungsfunktionen melden entweder
Fehler oder liefern mir den Zahlenwert als Zeichenkette zurück.
Hat jemand eine Idee, was ich tun kan? Könnte es vielleicht helfen,
die Felder neu als Timestamp in Oracle anzulegen? Wäre der Zugriff von
PHP dann noch derselbe?
Vielen Dank für jeden Hinweis,
Stefan
Re: PHP Timestamp (Integer) als Datum in Oracle verwenden
am 27.04.2007 12:14:28 von Dirk Ohme
stefan.d@gno.de schrieb im Newsbeitrag
> Nun muss ich aber eine Auswertung in Oracle
> erstellen, die nach Jahren gruppiert. Und da
> kann die Datenbank mit den Zahlen leider nichts
> anfangen.
Dann konvertiere doch die Timestamps beim Export von MySQL in
"yyyy-mm-dd HH:MM:SS" und importiere diese Information entweder als
VARCHAR in Oracle oder konvertiere dort zurück in ein
Datums-/Uhrzeitformat.
Gruß, Dirk
Re: PHP Timestamp (Integer) als Datum in Oracle verwenden
am 27.04.2007 15:28:43 von Andreas Froede
stefan.d@gno.de wrote:
> anpassen. Mein Vorgänger hat alle Datums-Werte in PHP als Timestamp
> anlegt und die Inhalte in Oracle als einfache Integer gespeichert.
Falls Du ihn noch in Schlagweite hast, prügel ihn.
> Nun muss ich aber eine Auswertung in Oracle erstellen, die nach Jahren
> gruppiert. Und da kann die Datenbank mit den Zahlen leider nichts
> anfangen.
Es sollte im Orakel eine Fkt geben, die unix-Timestamps zu
SQL-Timestamps konvertiert, ansonsten schreib Dir eine.
(Notfalls auch extern mit Auslesen und wieder reinschreiben)
Und ändere die Tabelle auf timestamp!
CIAO
andreas
--
.... oben geht es um den Thron - unten geht es um Deinen Hintern ...
[Keimzeit]
Klettern in Thüringen: http://www.climb.spider-net.de
Kletterhalle in Jena: http://www.wand.spider-net.de
Re: PHP Timestamp (Integer) als Datum in Oracle verwenden
am 03.05.2007 09:57:00 von Stefan Dase
On 27 Apr., 12:14, "Dirk Ohme" wrote:
> Dann konvertiere doch die Timestamps beim Export von MySQL in
> "yyyy-mm-dd HH:MM:SS" und importiere diese Information entweder als
> VARCHAR in Oracle oder konvertiere dort zurück in ein
> Datums-/Uhrzeitformat.
Danke für deine Hilfe, aber ich arbeite auf einer Oracle-Datenbank und
nicht mit MySQL!
Viele Grüße,
Stefan
Re: PHP Timestamp (Integer) als Datum in Oracle verwenden
am 03.05.2007 10:30:50 von Stefan Dase
On 27 Apr., 15:28, Andreas Froede wrote:
> Es sollte im Orakel eine Fkt geben, die unix-Timestamps zu
> SQL-Timestamps konvertiert, ansonsten schreib Dir eine.
Jup, habe ich gefunden:
create or replace FUNCTION unixts_to_date(unixts IN PLS_INTEGER)
RETURN DATE IS
/**
* Converts a UNIX timestamp into an Oracle DATE
*/
unix_epoch DATE :=3D TO_DATE('19700101000000','YYYYMMDDHH24MISS');
max_ts PLS_INTEGER :=3D 2145916799; -- 2938-12-31 23:59:59
min_ts PLS_INTEGER :=3D -2114380800; -- 1903-01-01 00:00:00
oracle_date DATE;
BEGIN
IF unixts> max_ts THEN
RAISE_APPLICATION_ERROR( -20901, 'UNIX timestamp too large for 32
bit limit');
ELSIF unixts
RAISE_APPLICATION_ERROR( -20901, 'UNIX timestamp too small for 32
bit limit' );
ELSE
oracle_date :=3D unix_epoch + NUMTODSINTERVAL(unixts, 'SECOND');
END IF;
RETURN (oracle_date);
END;
Die Umwandlung in DATE oder TIMESTAMP auf Oracle-Seite werde ich nicht
vornehmen, da ich damit sämtlichen PHP-Code, der nur irgendwas mit den
Datums-Einträgen zu tun hat, neu schreiben müsste.
Vielen Dank und viele Grüße,
Stefan
Re: PHP Timestamp (Integer) als Datum in Oracle verwenden
am 04.05.2007 13:26:07 von Andreas Froede
Stefan Dase wrote:
> Die Umwandlung in DATE oder TIMESTAMP auf Oracle-Seite werde ich nicht
> vornehmen, da ich damit sämtlichen PHP-Code, der nur irgendwas mit den
> Datums-Einträgen zu tun hat, neu schreiben müsste.
Klar. Niemals irgendwelchen Mist reparieren, die anderen sollen es
schließlich auch nicht leichter haben.
(Man könnte auch die kranken Clienten aus einem View bedienen.)
CIAO
andreas
--
.... oben geht es um den Thron - unten geht es um Deinen Hintern ...
[Keimzeit]
Klettern in Thüringen: http://www.climb.spider-net.de
Kletterhalle in Jena: http://www.wand.spider-net.de
Re: PHP Timestamp (Integer) als Datum in Oracle verwenden
am 04.05.2007 13:57:48 von Stefan Kuhn
Am Fri, 27 Apr 2007 15:28:43 +0200 schrieb Andreas Froede:
>> anpassen. Mein Vorgänger hat alle Datums-Werte in PHP als Timestamp
>> anlegt und die Inhalte in Oracle als einfache Integer gespeichert.
>
> Falls Du ihn noch in Schlagweite hast, prügel ihn.
Naja, bevor man sich prügelt sollte man sich erst einmal bei einem Tässchen
Matetee zusammensetzen und über das für und wider unterhalten.
Es gibt Fälle, in denen ich nämlich genau dies auch mache. Wenn ich z. B.
einen Zeitraum abspeichern möchte, in dem jemand Zugriff auf etwas haben
soll, dann speichere ich dies als unixtimestamp und IIRC varchar2.
Warum? Ganz einfach es ist weniger rechenintensiv. Der Timestamp steht mir
in PHP sofort zur Verfügung, ohne dass ich zusätzliche Funktionen benötige.
Ich kann ihn sofort in die Datenbank schreiben ohne ihn konvertieren zu
müssen.
Beim Vergleichen geht eine einfache Substraktion zweier Zahlenwerte
bedeutend schneller, als wenn ich erst in kompatible Datumswerte
konvertieren müsste.
Es gibt noch andere Gründe, weshalb es Sinn machen kann. Es sei hier nur
mal auf eine Änderung des DBMS hingewiesen.
Ste-"wollte-ich-nur-mal-so-anmerken"-fan
Re: PHP Timestamp (Integer) als Datum in Oracle verwenden
am 04.05.2007 14:40:58 von Dirk Ohme
Stefan Kuhn schrieb im Newsbeitrag
> Es gibt noch andere Gründe, weshalb es Sinn machen kann.
> Es sei hier nur mal auf eine Änderung des DBMS hingewiesen.
Genau das ist eigentlich ein Grund, warum man es *nicht* machen
sollte, sondern Standard-SQL-Datentypen einsetzen sollte! Bei einem
DATE-Typ kann ich sicher halbwegs sicher sein, dass die Zeitzone und
andere Sachen (Sommer-/Winterzeit) korrekt sind. Es ist einfacher zu
transportieren (Im-/Export).
Und in Zeiten, in denen die CPU mit wenigstens dem Dreifachen des
Arbeitsspeichers getaktet ist, sollte CPU-Zeit nun wirklich kein Thema
mehr sein! Anscheinend ist das Jahr 2000 zu wenig in Erinnerung und
2038 noch nicht präsent genug, um nur mal halbwegs überlegt seine
Daten zu speichern ...
Ach ja ... Datums-/Uhrzeitberechnungen über Umschaltzeitpunkte
Winter-/Sommerzeit machen als Integer ja auch *soviel* Spaß ... und
für jede anders geartete Ausgabe darf man sich dann auch gleich jede
Formatierungsroutine neu schreiben, denn eigentlich sollte ja auf
jedem halbwegs ordentlich geführten Unix-System der Timestamp nicht
mehr Int32, sondern vom Typ "time_t" sein ... was alles mögliche sein
kann (weshalb auch x = time() böse ist und es besser time(&x) lauten
sollte!).
Gruß, Dirk
Re: PHP Timestamp (Integer) als Datum in Oracle verwenden
am 04.05.2007 17:23:33 von Andreas Froede
Stefan Kuhn wrote:
> Am Fri, 27 Apr 2007 15:28:43 +0200 schrieb Andreas Froede:
>
> >> anpassen. Mein Vorgänger hat alle Datums-Werte in PHP als Timestamp
> >> anlegt und die Inhalte in Oracle als einfache Integer gespeichert.
> >
> > Falls Du ihn noch in Schlagweite hast, prügel ihn.
>
> Naja, bevor man sich prügelt sollte man sich erst einmal bei einem Tässchen
> Matetee zusammensetzen und über das für und wider unterhalten.
Kann man. Dann hat man ausreichend Aggressionen aufgebaut, damit das
Prügeln wirklungsvoller wird.
> Warum? Ganz einfach es ist weniger rechenintensiv. Der Timestamp steht mir
> in PHP sofort zur Verfügung, ohne dass ich zusätzliche Funktionen benötige.
> Ich kann ihn sofort in die Datenbank schreiben ohne ihn konvertieren zu
> müssen.
In ein System gehören sinnvolle Werte (aus Sicht des verwaltenden
Systems). An den Schnittstellen zwischen Systemen (DBMS - PHP) kann
konvertiert werden. Wenn ich in PHP einen Timestamp brauche, dann
lasse ich mir das Datum eben als timestamp geben.
Irgendwo wurde mir mal Datum als "YYYYMMDD"::varchar angeboten.
Um "00005I97" kümmerte sich dann der Client (meistens).
> Es gibt noch andere Gründe, weshalb es Sinn machen kann. Es sei hier nur
> mal auf eine Änderung des DBMS hingewiesen.
Deswegen verwendet man Standarddatentypen z.B. Datetime- und
Intervaltypen.
CIAO
andreas
--
.... oben geht es um den Thron - unten geht es um Deinen Hintern ...
[Keimzeit]
Klettern in Thüringen: http://www.climb.spider-net.de
Kletterhalle in Jena: http://www.wand.spider-net.de