sql >> Databáze >  >> RDS >> Oracle

Rozdíl mezi dvěma hodnotami rok, měsíc a den v Oracle

Když se nad tím důkladně zamyslíte, uvědomíte si, že nemůžete vypočítat rozdíl dvou „časových intervalů“, když jsou na místě měsíce; jednoduše proto, že odečtením měsíců může vzniknout různý počet dní. Můžete odečítat roky, můžete odečítat týdny, můžete odečítat dny,... můžete odečítat dny po sekundách, můžete odečítat roky od měsíců. Nemůžete však odečítat roky za dny.

Příklad:

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

Toto je vašich 15 let, 7 měsíců, 23 dní mínus 7 let, 9 měsíců, 12 dní, když vycházíme z 1. ledna 1900. To nám dalo 2871 dní rozdíl.

Zvažte však následující dva příklady, jednoduše posunuté o 1 a 6 měsíců do minulosti

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> 

Ty nám nyní daly rozdíl 2872 a 2874 dní.

Nyní, když mluvíme o možných odečítáních...

(a) odečtením meziročních intervalů

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> 

Všechny tři správně vytvářejí rozdíl 7 let a 10 měsíců.

(b) odečtením intervalů ze dne na sekundu

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> 

Všechny tři poskytují stejné výsledky, protože všechny tři jsou odečítáním intervalů ze dne na sekundu s konzistentním posunem částí den/hodina/minuta/sekunda hodnot intervalu.

(c) odečtením meziročních intervalů

Jak jsem řekl:Není možné. V Oracle dokonce neexistuje nic takového jako meziroční interval; tvůrci DB serveru věděli, proč se rozhodli je nepřidávat do enginu.




  1. UNION 2 Select-query s počítanými sloupci

  2. Proč GRANT nefunguje v MySQL?

  3. MySQL join - řazení výsledků přes jinou tabulku PHP

  4. Jak funguje Tanh() v PostgreSQL