sql >> Database >  >> RDS >> Oracle

Verschil tussen twee jaar-maand- en dagwaarden in Oracle

Als je er goed over nadenkt, zul je je realiseren dat je geen verschil van twee "tijdsintervallen" kunt berekenen als er maanden zijn; simpelweg omdat het aftrekken van maanden kan resulteren in een ander aantal dagen. Je kunt jaren aftrekken, je kunt weken aftrekken, je kunt dagen aftrekken,... je kunt dagen tot seconden aftrekken, je kunt jaren tot maanden aftrekken. U kunt echter niet van jaar tot dag aftrekken.

Voorbeeld:

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

Dit is uw 15 jaar, 7 maanden, 23 dagen min 7 jaar, 9 maanden, 12 dagen op basis van 1 januari 1900. Dit gaf ons 2871 dagen verschil.

Beschouw echter de volgende twee voorbeelden, eenvoudig verschoven met 1 en 6 maanden naar het verleden

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> 

Deze gaven ons nu 2872 en 2874 dagen verschil.

Nu, over mogelijke aftrekkingen gesproken...

(a) intervallen van jaar tot maand aftrekken

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> 

Alle drie produceren correct een verschil van 7 jaar en 10 maanden.

(b) intervallen van dag tot seconde aftrekken

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> 

Alle drie leveren dezelfde resultaten op, aangezien ze alle drie aftrekkingen zijn van intervallen van dag tot seconde met consistente compensatie van de dag/uur/minuut/seconde delen van de intervalwaarden.

(c) intervallen van jaar tot dag aftrekken

Zoals ik al zei:niet mogelijk. Er bestaat zelfs niet zoiets als een jaar-tot-dag interval in Oracle; makers van de DB-server wisten waarom ze besloten die niet aan de engine toe te voegen.




  1. Yii - maak een tijdelijke tabel en gebruik deze in de volgende query produceert Algemene fout:2014 Kan geen query's uitvoeren terwijl andere niet-gebufferde query's actief zijn

  2. Een Oracle SQL-scriptspoolbestand maken

  3. Django-query in een-op-veel-relatie

  4. Gegevens invoegen in MySQL-tabel vanuit Python-script