PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

dans postgres, pouvez-vous définir le formatage par défaut pour un horodatage, par session ou globalement ?

Dans PostgreSQL, le formatage des horodatages est indépendant du stockage. Une réponse est d'utiliser to_char et formatez l'horodatage au format dont vous avez besoin au moment où vous en avez besoin, comme ceci :

select to_char(current_timestamp, 'yyyy-MM-dd HH24:MI:SS.MS');

select to_timestamp('2012-10-11 12:13:14.123', 
     'yyyy-MM-dd HH24:MI:SS.MS')::timestamp;

Mais si vous devez définir la mise en forme par défaut :

Modifiez le format d'horodatage postgresql globalement :

Jetez un œil à votre fuseau horaire, exécutez ceci comme une requête sql :

show timezone
Result: "US/Eastern"

Ainsi, lorsque vous imprimez current_timestamp, vous voyez ceci :

select current_timestamp
Result: 2012-10-23 20:58:35.422282-04

Le -04 à la fin se trouve votre fuseau horaire par rapport à UTC. Vous pouvez modifier votre fuseau horaire avec :

set timezone = 'US/Pacific'

Ensuite :

select current_timestamp
Result: 2012-10-23 18:00:38.773296-07

Remarquez donc le -07 là, cela signifie que le Pacifique est à 7 heures de UTC. Comment puis-je faire disparaître ce fuseau horaire disgracieux ? Une façon consiste simplement à créer un tableau, il utilise par défaut un horodatage sans fuseau horaire :

CREATE TABLE worse_than_fail_table
(
    mykey          INT unique not null,
    fail_date      TIMESTAMP not null
);

Ensuite, si vous ajoutez un horodatage à ce tableau et sélectionnez-le

select fail_date from worse_than_fail_table
Result: 2012-10-23 21:09:39.335146

yay, pas de fuseau horaire à la fin. Mais vous voulez plus de contrôle sur la façon dont l'horodatage s'affiche par défaut ! Vous pourriez faire quelque chose comme ceci :

CREATE TABLE moo (
    key     int PRIMARY KEY,
    boo     text NOT NULL DEFAULT TO_CHAR(CURRENT_TIMESTAMP,'YYYYMM')
);

C'est un champ de texte qui vous donne plus de contrôle sur la façon dont il s'affiche par défaut lorsque vous faites un select somecolumns from sometable . Notez que vous pouvez convertir une chaîne en horodatage :

select '2012-10-11 12:13:14.56789'::timestamp
Result: 2012-10-11 12:13:14.56789

Vous pouvez convertir un current_timestamp en timestamp qui supprime le fuseau horaire :

select current_timestamp::timestamp
Result: 2012-10-23 21:18:05.107047

Vous pouvez vous débarrasser du fuseau horaire comme ceci :

select current_timestamp at time zone 'UTC'
Result: "2012-10-24 01:40:10.543251"

Mais si vous voulez vraiment récupérer le fuseau horaire, vous pouvez le faire :

select current_timestamp::timestamp with time zone
Result: 2012-10-23 21:20:21.256478-04

Vous pouvez extraire ce que vous voulez avec l'extrait :

SELECT EXTRACT(HOUR FROM TIMESTAMP '2001-02-16 20:38:40');
Result: 20

Et cette monstruosité :

SELECT TIMESTAMP WITH TIME ZONE '2001-02-16 20:38:40-05' AT TIME ZONE 'EST';
Result: 2001-02-16 20:38:40