web-dev-qa-db-fra.com

postgreSQL modifie le type de données de la colonne en horodatage sans fuseau horaire

Je souhaite modifier une colonne de données du texte en horodatage de type. Il n'y a pas de fuseau horaire dans mes données. Le format de mes données est comme 28-03-17 17:22, y compris l'heure et la date mais pas de fuseau horaire. En d'autres termes, toutes mes données sont dans le même fuseau horaire. Comment puis-je le faire?

J'ai essayé plusieurs façons ci-dessous, mais je ne trouve toujours pas la bonne approche. J'espère que vous pourrez m'aider.

Certes, je peux construire une nouvelle table si mon problème peut être résolu.

alter table AB
alter create_time type TIMESTAMP;

ERROR:  column "create_time" cannot be cast automatically to type timestamp without time zone
HINT:  You might need to specify "USING create_time::timestamp without time zone".
********** Error **********

ERROR: column "create_time" cannot be cast automatically to type timestamp without time zone
SQL state: 42804
Hint: You might need to specify "USING create_time::timestamp without time zone".
alter table AB
alter create_time type TIMESTAMP without time zone;

ERROR:  column "create_time" cannot be cast automatically to type timestamp without time zone
HINT:  You might need to specify "USING create_time::timestamp without time zone".
********** Error **********

ERROR: column "create_time" cannot be cast automatically to type timestamp without time zone
SQL state: 42804
Hint: You might need to specify "USING create_time::timestamp without time zone".
alter table AB
alter create_time::without time zone type TIMESTAMP;

ERROR:  syntax error at or near "::"
LINE 2:  alter create_time::without time zone type TIMESTAM
                          ^
********** Error **********

ERROR: syntax error at or near "::"
SQL state: 42601
Character: 50
alter table AB
alter create_time UTC type TIMESTAMP;

ERROR:  syntax error at or near "UTC"
LINE 2: alter create_time UTC type TIMESTAMP;
                          ^
********** Error **********

ERROR: syntax error at or near "UTC"
SQL state: 42601
Character: 50
7
Amy

Si create_time est de type TEXT avec une valeur de date valide, il sera plus facile de procéder au changement comme suit (il est conseillé de faire d'abord un vidage de table en tant que sauvegarde):

-- Create a temporary TIMESTAMP column
ALTER TABLE AB ADD COLUMN create_time_holder TIMESTAMP without time zone NULL;

-- Copy casted value over to the temporary column
UPDATE AB SET create_time_holder = create_time::TIMESTAMP;

-- Modify original column using the temporary column
ALTER TABLE AB ALTER COLUMN create_time TYPE TIMESTAMP without time zone USING create_time_holder;

-- Drop the temporary column (after examining altered column values)
ALTER TABLE AB DROP COLUMN create_time_holder;
11
Leo C

USING... vient après le type:

... alter create_time type TIMESTAMP USING create_time::TIMESTAMP;
4
Jasen

Vous n'avez pas spécifié le type d'origine de create_time, donc je suppose que c'est TIME avec le fuseau horaire (car le type DATE ou TIMESTAMP avec le fuseau horaire ne devrait pas donner ladite erreur lors de la tentative de modification de TIMESTAMP sans fuseau horaire). Étant donné que TIMESTAMP contient des informations de date en plus de TIME, vous devrez compléter vos informations de date dans votre instruction ALTER, comme:

ALTER TABLE AB ALTER COLUMN create_time TYPE TIMESTAMP without time zone USING date('20170327') + create_time;

Si vous avez une colonne DATE correspondante (par exemple, create_date), vous pouvez la transmettre à la fonction date (), comme:

ALTER TABLE AB ALTER COLUMN create_time TYPE TIMESTAMP without time zone USING date(create_date) + create_time;
2
Leo C