2009-10-29 10 views
27

J'essaie de trouver un nombre entier de jours entre deux dates dans Oracle 11g.Comment puis-je obtenir le nombre de jours entre deux dates dans Oracle 11g?

je peux Rapprochez en faisant

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

mais retourne un intervalle, et je n'ai pas été coulée avec succès ce à un nombre entier.

Editer: Apparemment dans 10g, cela renvoie le nombre de jours sous forme d'entier.

+3

que SQL doit renvoyer une valeur numérique, pas un intervalle – skaffman

+0

double possible de [Obtenez le nombre de jours entre deux dates dans Oracle, y compris des dates ] (http://stackoverflow.com/questions/20721413/get-the-number-of-days-between-two-dates-in-oracle-inclusive-of-the-dates) –

Répondre

11

Je l'ai compris moi-même. J'ai besoin

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

Bizarre. Comme avec les autres répondeurs, lorsque je fais votre requête d'origine, je reçois un nombre, pas un intervalle. Et quand j'essaye votre solution, j'obtiens une erreur, ORA-30076: champ d'extraction invalide pour la source d'extrait. C'est dans Oracle 10g; quelle version utilisez-vous? –

+0

11g. Ça pourrait être ça. Merci Dave. –

+0

L'utilisation de systimestamp à la place de sysdate signifie qu'il effectue l'horodatage plutôt que l'arithmétique de date, ce qui donne INTERVAL à la suite. Mais je ne peux pas reproduire votre expérience avec sysdate. –

3

Vous pouvez essayer d'utiliser:

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

trunc() ne fonctionnait pas pour moi. J'ai eu cette erreur: types de données incohérents: nombre attendu, a obtenu le jour d'intervalle au deuxième –

+0

oh ouais .. parce que vous n'avez pas la partie HH24: MI: SS dans la deuxième date .. content que vous l'avez compris –

32

Ou vous auriez pu faire ceci:

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

Cela renvoie un nombre de jours entiers:

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

INTERVALLE DE JOUR AU SECOND –

+0

Non, ce n'est pas le cas, qu'est-ce qui vous fait dire ça? –

+0

La preuve qu'il renvoie un NUMBER et non un INTERVAL JOUR AU SECOND ajouté à la réponse. –

1

Cela fonctionnera j'ai testé moi-même.
Il donne différence entre sysdate et la date extraite de la colonne 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 
Questions connexes