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

Forskellen mellem to år måned og dag værdier i Oracle

Når du tænker dig grundigt om, vil du indse, at du ikke kan beregne en forskel på to "tidsintervaller", når måneder er på plads; simpelthen fordi en subtraktion af måneder kan resultere i forskellige antal dage. Du kan trække år fra, du kan trække uger, du kan trække dage fra,... du kan trække dage-til-sekunder, du kan trække år-til-måneder. Du kan dog ikke trække år-til-dag fra.

Eksempel:

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

Dette er dine 15 år, 7 måneder, 23 dage minus 7 år, 9 måneder, 12 dage baseret på 1. januar 1900. Dette gav os en forskel på 2871 dage.

Overvej dog de følgende to eksempler, blot flyttet med 1 og 6 måneder til tidligere

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> 

Disse gav os nu 2872 og 2874 dages forskel.

Apropos mulige subtraktioner...

(a) subtrahering af intervaller fra år til måned

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 tre giver korrekt en forskel på 7 år og 10 måneder.

(b) subtrahering af intervaller fra dag til anden

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 tre giver de samme resultater, da alle tre er subtraktioner af dag-til-sekund-intervaller med konsekvent forskydning af dag/time/minut/sekund-delene af intervalværdierne.

(c) subtrahering af intervaller fra år til dag

Som sagt:Ikke muligt. Der er ikke engang sådan noget som år-til-dag interval i Oracle; skabere af DB-serveren vidste, hvorfor de besluttede ikke at tilføje dem til motoren.




  1. Hvordan tilføjer man foto i mysql-databasen ved hjælp af php?

  2. Opret forbindelse til Oracle-databasen i VB

  3. Forskellige tidszone_typer på DateTime-objekt

  4. MySQL-TABEL-erklæring