2012-03-19 16 views
39

La domanda è breve: se ho già dati in un timestamp di tipo colonna senza fuso orario, se imposto il tipo in timestamp con fuso orario, cosa fa postgresql con questi dati?PostgreSQL modifica il timestamp di tipo senza fuso orario -> con fuso orario

+0

Hai ragione, ma fino a quando accendo la mia applicazione/db/qualunque, la risposta potrebbe venire. – gyorgyabraham

+5

@a_horse_with_no_name perché "ha funzionato una volta" è un modo molto CATTIVO per sapere cosa farà ogni volta! –

+0

@couling: quindi stai insinuando che lo stesso insieme di istruzioni produrrà risultati diversi se eseguito più volte? Anche se tutti i parametri di input sono uguali? In tal caso, la risposta di dbhenur non proverebbe nulla perché, secondo te, eseguire questa affermazione una volta non garantisce che funzionerà allo stesso modo la volta successiva. –

risposta

38

Mantiene il valore corrente in localtime e imposta il fuso orario per il tuo localtime offset:

create table a(t timestamp without time zone, t2 timestamp with time zone); 
insert into a(t) values ('2012-03-01'::timestamp); 
update a set t2 = t; 
select * from a; 
      t   |   t2   
---------------------+------------------------ 
2012-03-01 00:00:00 | 2012-03-01 00:00:00-08 

alter table a alter column t type timestamp with time zone; 
select * from a; 
      t   |   t2   
------------------------+------------------------ 
2012-03-01 00:00:00-08 | 2012-03-01 00:00:00-08 

Secondo il manuale per Alter Table:

se [la clausola USING è] omesso , la conversione predefinita è la stessa di un cast di assegnazione dal vecchio tipo di dati a nuovo.

Secondo il manuale per Date/Time types

conversioni tra timestamp senza fuso e timestamp with time zone considerato i timestamp senza fuso valore deve essere preso o dato come fuso orario ora locale. È possibile specificare un fuso orario diverso per la conversione utilizzando AT TIME ZONE.

+0

Sì. Questo comportamento è esattamente lo stesso del lancio di timestamp senza fuso orario su timestamp con fuso orario. Se desideri qualcosa di diverso, puoi utilizzare la colonna "ALTER COLUMN TYPE type USING " e utilizzare le funzioni dell'ora per gestire i fusi orari. http://www.postgresql.org/docs/current/static/functions-datetime.html –

12

È meglio specificare il fuso orario in modo esplicito. Supponi che, se il tuo timestamp dovesse essere in UTC (ma senza fuso orario), dovresti essere cauto sul fatto che il fuso orario del client o del server potrebbe significare tutto qui. Invece scrivi:

ALTER TABLE a ALTER COLUMN t TYPE TIMESTAMP WITH TIME ZONE USING t AT TIME ZONE 'UTC'