Oracle
 sql >> Base de données >  >> RDS >> Oracle

Différence entre deux valeurs Année Mois et Jour dans Oracle

Lorsque vous y réfléchissez bien, vous vous rendrez compte que vous ne pouvez pas calculer une différence de deux "intervalles de temps" lorsque des mois sont en place; simplement parce qu'une soustraction de mois peut entraîner un nombre de jours différent. Vous pouvez soustraire des années, vous pouvez soustraire des semaines, vous pouvez soustraire des jours,... vous pouvez soustraire des jours en secondes, vous pouvez soustraire des années en mois. Cependant, vous ne pouvez pas soustraire des années à des jours.

Exemple :

SQL> select timestamp'1915-07-23 00:00:00' - timestamp'1907-09-12 00:00:00' as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000002871 00:00:00

Il s'agit de vos 15 ans, 7 mois, 23 jours moins 7 ans, 9 mois, 12 jours en se basant sur le 1er janvier 1900. Cela nous a donné une différence de 2871 jours.

Cependant, considérons les deux exemples suivants, simplement décalés de 1 et 6 mois vers le passé

select timestamp'1915-06-23 00:00:00' - timestamp'1907-08-12 00:00:00' as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000002872 00:00:00

select timestamp'1915-01-23 00:00:00' - timestamp'1907-03-12 00:00:00' as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000002874 00:00:00

SQL> 

Ceux-ci nous ont maintenant donné 2872 et 2874 jours de différence.

Maintenant, en parlant de soustractions possibles...

(a) en soustrayant les intervalles d'une année à l'autre

SQL> select interval'1915-07' year(4) to month - interval'1907-09' year(4) to month as diff_year_to_month_interval from dual;

DIFF_YEAR_TO_MONTH_INTERVAL
---------------------------
+000000007-10

select interval'1915-06' year(4) to month - interval'1907-08' year(4) to month as diff_year_to_month_interval from dual;

DIFF_YEAR_TO_MONTH_INTERVAL
---------------------------
+000000007-10

select interval'1915-01' year(4) to month - interval'1907-03' year(4) to month as diff_year_to_month_interval from dual;

DIFF_YEAR_TO_MONTH_INTERVAL
---------------------------
+000000007-10

SQL> 

Tous les trois produisent correctement une différence de 7 ans et 10 mois.

(b) soustraire des intervalles d'un jour à l'autre

SQL> select interval'15 01:02:03' day(2) to second - interval'07 02:03:04' day(2) to second as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000000007 22:58:59

select interval'14 00:01:02' day(2) to second - interval'06 01:02:03' day(2) to second as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000000007 22:58:59

select interval'09 11:12:13' day(2) to second - interval'01 12:13:14' day(2) to second as diff_day_to_second_interval from dual;

DIFF_DAY_TO_SECOND_INTERVAL
---------------------------
+000000007 22:58:59

SQL> 

Tous les trois produisent les mêmes résultats, car tous les trois sont des soustractions d'intervalles de jour en seconde avec un décalage cohérent des parties jour/heure/minute/seconde des valeurs d'intervalle.

(c) en soustrayant les intervalles d'une année à l'autre

Comme je l'ai dit :pas possible. Il n'y a même pas d'intervalle d'une année à l'autre dans Oracle; les créateurs du serveur de base de données savaient pourquoi ils avaient décidé de ne pas les ajouter au moteur.