sql >> Databasteknik >  >> RDS >> Oracle

Skillnad mellan två års månads- och dagvärden i Oracle

När du tänker efter ordentligt kommer du att inse att du inte kan beräkna en skillnad på två "tidsintervall" när månader är på plats; helt enkelt för att en subtraktion av månader kan resultera i olika antal dagar. Du kan subtrahera år, du kan subtrahera veckor, du kan subtrahera dagar,... du kan subtrahera dagar-till-sekunder, du kan subtrahera år-till-månader. Du kan dock inte subtrahera år till dagar.

Exempel:

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

Detta är dina 15 år, 7 månader, 23 dagar minus 7 år, 9 månader, 12 dagar baserat på 1 januari 1900. Detta gav oss en skillnad på 2871 dagar.

Tänk dock på följande två exempel, helt enkelt flyttade med 1 och 6 månader till tidigare

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> 

Dessa gav oss nu 2872 och 2874 dagars skillnad.

Nu, på tal om möjliga subtraktioner...

(a) subtrahera intervall från år till månad

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> 

Alla tre ger korrekt en skillnad på 7 år och 10 månader.

(b) subtrahera intervall från dag till andra

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> 

Alla tre ger samma resultat, eftersom alla tre är subtraktioner av dag-till-sekund-intervall med konsekvent förskjutning av dag/timme/minut/sekund delar av intervallvärdena.

(c) subtrahera intervall från år till dag

Som sagt:Inte möjligt. Det finns inte ens något som heter intervall från år till dag i Oracle; tillverkare av DB-servern visste varför de bestämde sig för att inte lägga till dem i motorn.




  1. Skicka MySQL-variabler till skript från kommandoraden

  2. Effektiv strategi för att lämna en revisionsspår/ändringshistorik för DB-applikationer?

  3. Hur man grupperar hierarkiska relationer i SQL Server

  4. php Fråga INNER gå med i tabeller