Oracle
 sql >> Database >  >> RDS >> Oracle

Differenza tra i valori del mese e del giorno di due anni in Oracle

Quando ci pensi a fondo, ti renderai conto che non puoi calcolare una differenza di due "intervalli di tempo" quando i mesi sono a posto; semplicemente perché una sottrazione di mesi può comportare un numero diverso di giorni. Puoi sottrarre anni, puoi sottrarre settimane, puoi sottrarre giorni,... puoi sottrarre giorni a secondi, puoi sottrarre anni a mesi. Tuttavia, non puoi sottrarre gli anni in giorni.

Esempio:

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

Questi sono i tuoi 15 anni, 7 mesi, 23 giorni meno 7 anni, 9 mesi e 12 giorni se basati sul 1 gennaio 1900. Questo ci ha dato 2871 giorni di differenza.

Tuttavia, considera i due esempi seguenti, semplicemente spostati di 1 e 6 mesi al passato

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> 

Questi ora ci hanno dato 2872 e 2874 giorni di differenza.

Ora, parlando di possibili sottrazioni...

(a) sottraendo gli intervalli di anno in mese

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> 

Tutti e tre producono correttamente una differenza di 7 anni e 10 mesi.

(b) sottraendo intervalli da giorno a secondo

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> 

Tutti e tre producono gli stessi risultati, poiché tutti e tre sono sottrazioni di intervalli da giorno a secondo con una compensazione coerente delle parti giorno/ora/minuto/secondo dei valori dell'intervallo.

(c) sottraendo gli intervalli da un anno all'altro

Come ho detto:non è possibile. Non esiste nemmeno l'intervallo da un anno all'altro in Oracle; i produttori del server DB sapevano perché hanno deciso di non aggiungerli al motore.