Extraire le nombre total de secondes à partir d'un intervalle de type de données
Lors de la soustraction de timestamps
la valeur de retour est une interval
type de données. Est-il un moyen élégant pour convertir cette valeur en le nombre total de (milli/micro) secondes dans l'intervalle, c'est à dire un entier.
Suivantes pourraient travailler, mais c'est pas très jolie:
select abs( extract( second from interval_difference )
+ extract( minute from interval_difference ) * 60
+ extract( hour from interval_difference ) * 60 * 60
+ extract( day from interval_difference ) * 60 * 60 * 24
)
from ( select systimestamp - (systimestamp - 1) as interval_difference
from dual )
Est-il plus élégant de la méthode dans SQL ou PL/SQL?
- :quelque part j'ai trouvé ce ` select (TRUNC(SYSDATE) + out.interv ention - TRUNC(SYSDATE)) * 86400 from (select systimestamp -(systimestamp -1) comme interv ention de double )out"
- depuis l'ajout de la déclaration de l'intervalle, en secondes, pour une précision fixe variable du numéro, la partie fractionnaire de la seconde est perdu dans la requête mentionné dans les commentaires
- Bien que cela puisse ne pas sembler élégant, je préfère encore cette solution de base qu'il ne souffre pas de "ORA-01873: le leader de la précision de l'intervalle est trop petit" facilement.
Vous devez vous connecter pour publier un commentaire.
J'espère que cela aide:
Avec votre test:
Une façon très simple:
L'idée est de convertir la valeur de l'intervalle en jours par les temps 86400 (= 24*60*60).
Puis en extraire le "jour" de la valeur qui est en fait la deuxième valeur de ce que nous voulions.
extract(day from (ts1-ts2)*86400*1000) / 1000
pour obtenir la précision à la milliseconde.J'ai trouvé que cela fonctionne. Apparemment, si vous ne l'arithmétique avec des horodatages, ils sont convertis à l'interne type de données, lorsque soustraite de chaque d'autres, renvoie l'intervalle comme un nombre.
Facile? Oui. Élégant? Pas de. Obtient le travail fait? Oh ouais.
Malheureusement, je ne pense pas qu'il existe une alternative (ou plus élégant) de calcul de secondes à partir d'un type d'intervalle en pl/sql. Comme cet article mentionne:
donc l'extraction de jour, heure, etc à partir de l'intervalle et de les multiplier avec les valeurs correspondantes semble que la seule façon.
Basé sur zep réponse, j'ai emballé les choses dans une fonction pour votre confort:
Utiliser la requête suivante:
SELECT to_char(ENDTIME,'yyyymmddhh24missff')-to_char(STARTTIME,'yyyymmddhh24missff') COMME c'est DUR
FROM DUAL;
yyyymmddhh24miss - VA DONNER de la DURÉE À SEC
yyyymmddhh24mi DURÉE EN MIN
yyyymmddhh24 de la DURÉE des HEURES
aaaammjj DURÉE EN JOURS