Exemple:
INTERVAL '5 minute'
, alors la sortie souhaitée est 2018-05-17 22:50:00.INTERVAL '10 minute'
, alors la sortie souhaitée est 2018-05-17 22:50:00.INTERVAL '1 hour'
, alors la sortie souhaitée est 2018-05-17 23:00:00.INTERVAL '1 day'
, alors la sortie souhaitée est 2018-05-18 00:00:00.Pour chaque 3 cas, vous prenez l'exemple:
select now(), date_trunc('hour', now()), date_trunc('hour', now()) + (10 * round(extract(minute from now())/10) || ' minute')::interval;
now | date_trunc | ?column?
-------------------------------+------------------------+------------------------
2018-05-17 19:21:44.797717-05 | 2018-05-17 19:00:00-05 | 2018-05-17 19:20:00-05
(1 row)
select now(), date_trunc('day', now()), date_trunc('day', now()) + (1 * round(extract(hour from now())/1) || ' hour')::interval;
now | date_trunc | ?column?
-------------------------------+------------------------+------------------------
2018-05-17 19:22:34.508226-05 | 2018-05-17 00:00:00-05 | 2018-05-17 19:00:00-05
(1 row)
select now(), date_trunc('month', now()), date_trunc('month', now()) + (1 * round(extract(day from now())/1) || ' day')::interval;
now | date_trunc | ?column?
-------------------------------+------------------------+------------------------
2018-05-17 19:23:56.562104-05 | 2018-05-01 00:00:00-05 | 2018-05-18 00:00:00-05
(1 row)
Donc essentiellement dans
date_trunc('X', now()) + (Y * round(extract(Z from now())/Y) || ' Z')::interval
vous devriez remplacer:
et bien sûr, remplacez now()
par l'horodatage, vous traitez avec.
Cela pourrait être résumé dans la fonction qui la crée en fonction de la valeur d'intervalle et de l'étape que vous fournissez, pour votre horodatage spécifique.
Je ne sais pas que vous avez compris la troncature exacte que vous souhaitez, vous devrez peut-être remplacer round
par ceil
.