web-dev-qa-db-fra.com

Contraindre un horodatage postgres à "fin de journée"?

donné une table nommée bananas
et A timestamp without time zone colonne nommée end_time
[.____] -et Certains psql Clients ont set timezone to 'UTC'
[.____] --et Autre psql Clients ont set timezone to 'US/Eastern'
[.____] -et la configuration du serveur a timezone = 'UTC' dans postgresql.conf

Comment écrirait-on une contrainte de chèque sur bananas.end_time pour être sur de end_time est toujours la fin de la journée, définie comme la 23e heure et la 59e minute et 59e seconde de A "US/Est" jour?

J'ai essayé:

alter table bananas
add constraint ck_end_time_is_end_of_day
check (
  23 = date_part('hour', end_time at time zone 'UTC' at time zone 'US/Eastern')
  and 59 = date_part('minute', end_time at time zone 'UTC' at time zone 'US/Eastern') 
  and 59 = floor(date_part('second', end_time at time zone 'UTC' at time zone 'US/Eastern')) 
)
;

Cela semble contraindre correctement la colonne, mais cela semble terriblement inefficace et assez illisible. Existe-t-il une implémentation plus efficace et/ou plus lisible?

3
Jared Beck

Vous pouvez utiliser to_char Pour obtenir les champs de temps d'un appel de fonctions unique:

check (to_char(end_time at time zone 'UTC' at time zone 'US/Eastern','HH24:MI:SS') = '23:59:59')

Secondes données par SS ne sont pas arrondies de sorte que cela devrait être ok comme équivalent à floor

3
Daniel Vérité