2009-06-04 8 views
85

Dire que j'ai un intervalle commeComment convertir un intervalle en un nombre d'heures avec postgres?

4 days 10:00:00 

dans Postgres. Comment puis-je convertir en un certain nombre d'heures (? 106 dans ce cas) Y at-il une fonction ou devrais-je mordre la balle et faire quelque chose comme

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

Remarque: Si votre intervalle contient des mois ou des années, il n'y a pas de réponse définie de combien d'heures il y a, puisque le nombre de jours dans un mois ou une année varie. Alors attention à ça! – Teddy

Répondre

167

Probablement la meilleure façon est:

SELECT EXTRACT(epoch FROM my_interval)/3600 
+6

Et peut-être floor ou cast le résultat en entier si l'intervalle contient des minutes et/ou des secondes – rasjani

+34

Extrayez l'époque? Oh mon Dieu, ça ne m'aurait pas traversé l'esprit dans un million d'années. – agnul

+1

SELECT EXTRACT (époque FROM my_interval/3600) (l'intervalle a le support 'divide integer' natif, le résultat est interval, et le résultat de l'extraction est entier, pas float). Alors. Autocast/étage fait. – Offenso

12

Si vous voulez entier à savoir le nombre de jours:

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

Super! Merci pour cela :) Pourtant, j'ai trouvé que nous pouvons maintenant modifier cela pour être SELECT extrait ('epoch' FROM age ('2014-08-02' :: timestamp))/86400' (J'utilise Pg 9.4), puisque 'age (ts)' utilise automatiquement 'CURRENT_DATE' quand un seul argument. – 1111161171159459134

+0

Attention: extraire simplement l'époque suppose implicitement qu'un mois = 30 jours et un an = 365,25 jours. – Teddy

-2
  select date 'now()' - date '1955-12-15'; 

Voici la requête simple qui calcule totale pas de jours.

+2

Cela ne prend pas de valeur d'intervalle. – Teddy

3

Pour obtenir le nombre de jours de la manière la plus simple serait:

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

Pour autant que je sais qu'il retournerait la même chose que:

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

Si votre intervalle est «1 mois 0 jours», l'utilisation de 'extract (jour à partir de ...)' vous donnera '0' comme résultat. – Underyx

0

Si vous convertissez champ de table:

  1. Définissez le champ afin qu'il contienne des secondes: CREATE TABLE IF NOT EXISTS test ( ... field INTERVAL SECOND(0) );
  2. Extrayez la valeur. Ne pas oublier les int autre sage, vous pouvez obtenir une mauvaise surprise une fois que les intervalles sont grands: EXTRACT(EPOCH FROM field)::int
Questions connexes