web-dev-qa-db-fra.com

Comment puis-je faire du temps sur le multiple supérieur d'un intervalle de temps arbitraire?

Exemple:

  • Si l'heure actuelle est 2018-05-17 22:45:30 et l'intervalle souhaité est INTERVAL '5 minute', alors la sortie souhaitée est 2018-05-17 22:50:00.
  • Si l'heure actuelle est 2018-05-17 22:45:30 et l'intervalle souhaité est INTERVAL '10 minute', alors la sortie souhaitée est 2018-05-17 22:50:00.
  • Si l'heure actuelle est 2018-05-17 22:45:30 et l'intervalle souhaité est INTERVAL '1 hour', alors la sortie souhaitée est 2018-05-17 23:00:00.
  • Si l'heure actuelle est 2018-05-17 22:45:30 et l'intervalle souhaité est INTERVAL '1 day', alors la sortie souhaitée est 2018-05-18 00:00:00.
5
Gajus

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:

  • X Par le prochain élément supérieur de la base utilisée dans l'intervalle (ex: Si l'intervalle utilise la journée, X doit être mois)
  • Y est la valeur utilisée dans l'intervalle
  • Z est l'objet utilisé dans l'intervalle, comme heure

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.

2
Patrick Mevzek