244 votes

Comment convertir un intervalle en nombre d'heures avec postgres ?

Disons que j'ai un intervalle comme

4 days 10:00:00

dans postgres. Comment puis-je convertir ce chiffre en nombre d'heures (106 dans ce cas) ? Existe-t-il une fonction ou dois-je mordre la balle et faire quelque chose comme

extract(days, my_interval) * 24 + extract(hours, my_interval)

9 votes

Remarque : si votre intervalle contient des mois ou des années, il n'y a pas de réponse définie quant au nombre d'heures, car le nombre de jours dans un mois ou une année varie. Faites donc attention à cela !

1 votes

@Teddy : Plus précisément, il y a multiple réponses définies ;)

464voto

Magnus Hagander Points 8671

Le moyen le plus simple est sans doute :

SELECT EXTRACT(epoch FROM my_interval)/3600

8 votes

Et peut-être faire un plancher ou convertir le résultat en entier si l'intervalle contient des minutes et/ou des secondes.

89 votes

Extraire l'époque ? Oh mon dieu, ça ne m'aurait pas traversé l'esprit en un million d'années.

7 votes

SELECT EXTRACT(epoch FROM my_interval/3600) (interval a un support natif de 'divide integer', le résultat est un intervalle, et le résultat de l'extraction est un entier, et non un flottant). Donc. Autocast/Floor fait.

38voto

Pujan Srivastava Points 964

Si vous voulez un nombre entier, c'est-à-dire le nombre de jours :

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int

0 votes

Super ! Merci pour cela :) Pourtant, j'ai trouvé que nous pouvons maintenant modifier ceci pour être SELECT extract('epoch' FROM age('2014-08-02'::timestamp)) / 86400 (j'utilise Pg 9.4), puisque age(ts) utiliser automatiquement CURRENT_DATE lorsqu'il n'y a qu'un seul argument.

19 votes

Attention : la simple extraction de l'époque suppose implicitement qu'un mois = 30 jours et une année = 365,25 jours.

10voto

belveryin Points 135

Pour obtenir le nombre de jours, la méthode la plus simple est la suivante :

SELECT EXTRACT(DAY FROM NOW() - '2014-08-02 08:10:56');

Pour autant que je sache, il retournerait la même chose que :

SELECT (EXTRACT(epoch FROM (SELECT (NOW() - '2014-08-02 08:10:56')))/86400)::int;

3voto

haoming Points 129
select floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600)), count(*)
from od_a_week
group by floor((date_part('epoch', order_time - '2016-09-05 00:00:00') / 3600));

El ::int La conversion suit le principe de l'arrondi. Si vous souhaitez un résultat différent, par exemple un arrondi vers le bas, vous pouvez utiliser la fonction mathématique correspondante, par exemple floor .

0voto

Janek Olszak Points 328

Si vous convertissez le champ de la table :

  1. Définissez le champ pour qu'il contienne des secondes :

     CREATE TABLE IF NOT EXISTS test (
         ...
         field        INTERVAL SECOND(0)
     );
  2. Extraire la valeur. N'oubliez pas de convertir en int Sinon, vous risquez d'avoir une surprise désagréable une fois que les intervalles seront grands :

    EXTRACT(EPOCH FROM field)::int

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X