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?
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