2009-10-29 16 views
27

Próbuję znaleźć liczbę całkowitą dni między dwiema datami w Oracle 11g.Jak mogę uzyskać liczbę dni między 2 datami w Oracle 11g?

mogę zbliżyć wykonując

select sysdate - to_date('2009-10-01', 'yyyy-mm-dd') from dual 

ale zwraca interwał, a ja nie udało odlewniczy to do liczby całkowitej.

Edycja: Podobno w 10g, zwraca liczbę dni jako liczbę całkowitą.

+3

że SQL powinna zwrócić wartość liczbową, a nie przedział – skaffman

+0

możliwe duplikat [Get liczbę dni między dwiema datami w Oracle, włącznie z datami ] (http://stackoverflow.com/questions/20721413/get-the-number-days-between-two-dates-in-coracle-inclusive-of-the-dates) –

Odpowiedz

11

Sam to wymyśliłem. Muszę

select extract(day from sysdate - to_date('2009-10-01', 'yyyy-mm-dd')) from dual 
+5

Dziwne. Podobnie jak w przypadku innych odbierających, kiedy wykonuję twoje pierwotne zapytanie, otrzymuję numer, a nie odstęp. A kiedy wypróbowuję twoje rozwiązanie, pojawia się błąd, ORA-30076: nieprawidłowe pole ekstraktu dla źródła ekstraktu. To jest w Oracle 10g; Jakiej wersji używasz? –

+0

11g. To może być to. Dzięki, Dave. –

+0

Użycie systimestamp zamiast sysdate oznacza, że ​​robi znacznik czasu zamiast arytmetycznej daty, co daje wynik INTERVALs. Ale nie mogę odtworzyć twojego doświadczenia z sysdate. –

3

Można spróbować użyć:

select trunc(sysdate - to_date('2009-10-01', 'yyyy-mm-dd')) as days from dual 
+0

trunc() nie działa dla mnie. Dostałem ten błąd: niespójne typy danych: oczekiwany NUMBER, otrzymałem INTERWAŁOWY DZIEŃ DO DRUGIEGO –

+0

o tak ... ponieważ nie masz części HH24: MI: SS w drugiej dacie .. Cieszę się, że to się domyśliło –

32

Albo mógł to zrobić:

select trunc(sysdate) - to_date('2009-10-01', 'yyyy-mm-dd') from dual 

ta zwraca liczbę pełnych dni:

SQL> create view v as 
    2 select trunc(sysdate) - to_date('2009-10-01', 'yyyy-mm-dd') diff 
    3 from dual; 

View created. 

SQL> select * from v; 

     DIFF 
---------- 
     29 

SQL> desc v 
Name     Null? Type 
---------------------- -------- ------------------------ 
DIFF       NUMBER(38) 
+0

To nadal zwraca INTERWAŁ DZIEŃ DO DRUGIEGO –

+0

Nie, nie, co sprawia, że ​​tak mówisz? –

+0

Dowód, że zwraca NUMBER, a nie INTERWAŁ DZIEŃ DO DRUGIE dodane do odpowiedzi. –

1

To zadziała, przetestowałem siebie.
Daje to różnicę między SYSDATE i daty pobrana z kolumny admitdate

TABLE SCHEMA: 
    CREATE TABLE "ADMIN"."DUESTESTING" 
    ( 
    "TOTAL" NUMBER(*,0), 
"DUES" NUMBER(*,0), 
"ADMITDATE" TIMESTAMP (6), 
"DISCHARGEDATE" TIMESTAMP (6) 
    ) 

EXAMPLE: 
select TO_NUMBER(trunc(sysdate) - to_date(to_char(admitdate, 'yyyy-mm-dd'),'yyyy-mm-dd')) from admin.duestesting where total=300 
Powiązane problemy