2009-11-03 5 views
10

Bakground: Ich habe eine Legacy-App, die ich arbeite, die DATE-Typen für die meisten Zeit Speicher in der Datenbank verwendet. Ich möchte versuchen, einige dieser Tabellen zu aktualisieren, so dass sie Zeitzonen verwenden können, da dies Probleme mit Benutzern in verschiedenen Bereichen verursacht, von denen die db ist (siehe A unten). Dies ist für Oracle 10g.Oracle DATE Spalten zu TIMESTAMP mit Zeitzone migrieren

Quetions:

1) Kann ich diese "an seinem Platz." Wandern Das kann ich so konvertieren

DATE_COL = type:DATE => DATE_COL = type:TIMESTAMP 

... oder muss ich einen anderen Spaltennamen verwenden?

Beachten Sie, dass Daten beibehalten werden müssen. Wenn dies in einem Migrationsskript halb leicht gemacht werden kann, wird es für meine Zwecke funktionieren.

2) Ist diese Art der Konvertierung abwärtskompatibel? Wir haben wahrscheinlich einige Skripte oder Berichte, die diese Tabelle treffen werden, von denen wir vielleicht nichts wissen. Wir können uns wahrscheinlich damit befassen, aber ich würde gerne wissen, in welches Hornissennest ich gehe.

3) Auf welche Fallgruben sollte ich achten?

Danke,

EDIT:
(teilweise als Reaktion auf Gary)

Ich bin fein mit einem mehrstufigen Prozess.

1) Daten in eine neue Spalte Zeitstempel bewegen (caled TEMP) mit irgendeiner Art von Umwandlung 2) fallen alte Spalte (wir es my_date) 3) erstellen mit dem alten Datum Spaltennamen neue Zeitstempel Spalte nennen wollen (my_date) 4) verschieben von Daten in die my_date Spalte 5) fallen TEMP Spalte

A Gary auch Klärung der spezifischen Zeitzone Frage wollte. Ich habe meine Antwort von unten kopiert, um sie lesbarer zu halten.

Grundsätzlich wird auf die Daten aus verschiedenen Bereichen zugegriffen. Wir müssen in der Lage sein, nach Bedarf in die lokale Zeitzone zu konvertieren. Wir haben auch Trigger, die sysdate verwenden, was die Dinge noch komplizierter macht. Zeitstempel mit Zeitzone lindert viele dieser Schmerzen.

Oh, und danke für die Antworten bisher.

Antwort

14

Sie könnten nur laufen:

ALTER TABLE your_table MODIFY your_date_column TIMESTAMP WITH TIME ZONE; 

Aber ich würde empfehlen, eine TIMESTAMP-Spalte der Tabelle hinzugefügt, eine Update-Anweisung verwendet wird, zu füllen und die ursprüngliche Datumsspalte fallen, wenn Sie so wählen:

ALTER TABLE your_table ADD date_as_timestamp TIMESTAMP WITH TIME ZONE; 

UPDATE your_table 
    SET date_as_timestamp = CAST(date_column AS TIMESTAMP WITH TIME ZONE); 

Die Konvertierung ist abwärtskompatibel - Sie können & beliebig zurücksetzen.

+0

Ich denke, was ich möchte geklärt ist, wenn ich die Spalte mit einem Zeitstempel (wie ich in meinem Update beschreiben) ersetzen, werden Berichte und Abfragen, die diese Felder verwenden, an einem Timestamp ersticken? (Dies wird nur gelesen werden) Könnte ich einen Zeitstempel als eine Unterklasse des Datums betrachten oder gibt es genug Orakel-Feinheiten, um dies zu einer sehr schlechten Annahme zu machen? –

+0

'TIMESTAMP' ist ein anderer Datentyp - Berichte und Abfragen müssen auf Auswirkungen überprüft werden. Es ist nicht so, dass die db "würgen" wird, aber dass die Funktionen/etc wahrscheinlich nicht flexibel auf den Datentyp sind, so dass sie entsprechend angepasst werden müssen. –

+0

'TIMESTAMP' zeichnet nicht die Zeitzone auf, die die Frage erfordert. Sie sollten "TIMESTAMP WITH TIME ZONE" oder "TIMESTAMP WITH LOCAL TIME ZONE" verwenden. Siehe http://download.oracle.com/docs/cd/B19306_01/server.102/b14225/ch4datetime.htm. Ersteres speichert die Datums- und Zeitzone in der Spalte, während Letzteres das auf die Datenbank-Zeitzone normierte Datum speichert, aber in die Benutzersitzungszeit umwandelt, wenn der Benutzer die Spalte abfragt. –

6

Einfach genug, um zu demonstrieren

SQL> create table x (y date); 
Table created. 
SQL> insert into x select sysdate from dual; 
1 row created. 
SQL> commit; 
Commit complete. 
SQL> alter table x modify y timestamp; 
Table altered. 
SQL> select * from x; 

Y 
--------------------------------------------------------------------------- 
03/NOV/09 12:49:03.000000 PM 
SQL> alter table x modify y date; 
Table altered. 
SQL> select * from x; 
Y 
--------- 
03/NOV/09 
SQL> alter table x modify y timestamp with time zone; 
alter table x modify y timestamp with time zone 
ERROR at line 1: 
ORA-01439: column to be modified must be empty to change datatype 
SQL> alter table x modify y timestamp with local time zone; 
Table altered. 
SQL> alter table x modify y date; 
Table altered. 

So können Sie von Datum Zeitstempel (oder Zeitstempel mit lokaler Zeitzone) gehen und wieder zurück, aber nicht für Zeitstempel mit Zeitzone (also dort, wo den Offset beibehalten). Sie müssten eine weitere Spalte hinzufügen und die vorhandenen Daten kopieren (mit einem Standardwert für die entsprechende Zeitzone).

"verursacht Probleme mit Benutzern in verschiedenen Bereichen von denen die db ist". Könnte helfen, ein bisschen genauer zu sein. Reicht es aus, die Daten (oder Zeitstempel) aus der Zeitzone der Datenbank in die Zeitzone des Benutzers zu konvertieren, wenn sie eingefügt/geändert/abgefragt werden, oder müssen Sie tatsächlich die Tatsache beibehalten, dass der Datensatz um 15:00 Uhr in einer bestimmten Zeitzone erstellt wurde.

+0

"verursacht Probleme mit Benutzern in verschiedenen Bereichen von denen die db ist" Grundsätzlich werden die Daten aus mehreren verschiedenen Bereichen zugegriffen. Wir müssen in der Lage sein, nach Bedarf in die lokale Zeitzone zu konvertieren. Wir haben auch Trigger, die sysdate weiter komplizieren. Zeitstempel mit Zeitzone lindert viele dieser Schmerzen. –

+0

Löst Zeitstempel mit lokaler Zeitzone das Problem beheben. Wenn dies der Fall ist, ist es die einfachste zu implementierende Lösung. –

+2

PS. Wenn Sie ein Datum von einem anderen subtrahieren, erhalten Sie eine numerische Antwort in Tagen. Mit Zeitstempeln erhalten Sie einen INTERVAL-Datentyp. Das ist ein Fehler, nach dem zu suchen ist –

Verwandte Themen