2013-05-03 3 views
4

Je suis dans le fuseau horaire Europe/Berlin (+02), Postgresql est en cours d'exécution à l'UTC (+00). Je dois obtenir l'horodatage avec le fuseau horaire à la dernière date locale de minuit (la date du début du jour du jour actuel dans mon fuseau horaire).Postgres: obtenir l'horodatage local avec fuseau horaire du dernier minuit

donc mon résultat final serait quelque chose comme ça si nous avons 03/03/2013 14: 00: 00 + 02

2013-03-03 22:00:00+00 
2013-03-04 00:00:00+02 // the same 

J'ai essayé de cette date avec

SELECT TIMESTAMP 'today' AT TIME ZONE 'Europe/Berlin' 

Malheureusement cela donne la mauvaise date (le jour précédent minuit) pendant 00:00 et 02:00 comme l'heure UTC est le jour précédent et semble aujourd'hui utiliser utc pour calculer le reste.

Si nous avons 03/03/2013 00h05 à Europe/Berlin ce sera de retour

2013-05-01 22:00:00+00 

Si je veux avoir la bonne date que je dois utiliser

SELECT date_trunc('day', now() AT TIME ZONE 'Europe/Berlin') AT TIME ZONE 'Europe/Berlin'; 
2013-05-02 22:00:00+00 

qui est correct, mais assez moche.

Y a-t-il une variante plus propre de cette commande?

Répondre

1

envelopper dans une fonction:

create function midnight() returns timestamptz as $$ 
    select date_trunc('day', now() AT TIME ZONE 'Europe/Berlin') AT TIME ZONE 'Europe/Berlin'; 
$$ language sql; 
4

Utilisez timestamptz. Le tz à la fin ce qui signifie with time zone:

SELECT TIMESTAMPTZ 'today' AT TIME ZONE 'Europe/Berlin' 

Ou si vous l'aimez plus explicite:

SELECT TIMESTAMP with time zone 'today' AT TIME ZONE 'Europe/Berlin' 
Questions connexes