2010-01-25 4 views
3

J'ai une table pour les commandes et il a 2 colonnes avec les types DATE: delivery_date et order_date. Dans mon sqldeveloper, toutes les dates que j'ai insérées via Java ou à la main sont au format 10.01.25 pour le 25 janvier de cette année. Lorsque je tente de voir l'TOTAL_PRICE pour les commandes entre une date et une autre, je force le format comme celui-ci:Comment sélectionner les résultats entre deux dates ou par année/mois/jour dans Oracle? (to_date, extract, sysdate)

create or replace function calc_Outlays (init_date IN DATE,final_date IN date)return number is 

v_total_enc FORNECIMENTO.TOTAL_ENC_FORNEC%TYPE; 

begin 
select f.total_enc_fornec into v_total_enc from fornecimento f where f.data_entrega between init_date and final_date; 
return v_total_enc; 

Exception 
When no_data_found then 
Insert Into errors Values (0,'No supplyment costs found for dates between '||to_char(init_date)||' and '||to_char(final_date),systimestamp); 
return -1; 
end; 

mais je reçois -1 retourné. J'essaie même de faire la requête comme ceci: select f.total_enc_fornec from fornecimento f where f.data_entrega = '10.01.24';
comme ceci: select f.total_enc_fornec from fornecimento f where f.data_entrega = to_date('10.01.24','yy-mm-dd');
comme ceci: select f.total_enc_fornec from fornecimento f where f.data_entrega < to_date('10.01.24'); et rien est de retour! mais si j'exécute: select f.total_enc_fornec from fornecimento f where f.data_entrega <= sysdate; il imprime un résultat comme il est censé ...

Comment est-ce que je peux faire ceci? Je ne suis clairement pas passer correctement les paramètres ni dans la fonction, ni exécuter la requête elle-même

Btw, et si je voulais sélectionner TOUS les ordres d'une année/mois/jour? Dites, en utilisant la fonction d'extraction par exemple. Pourriez-vous s'il vous plaît me montrer comment? J'ai essayé, mais j'ai les mêmes problèmes et moi, c'est simple dans le concept, au moins, lol.

+0

ne devrait pas TO_DATE ('10 .01.24' , » yy-mm-dd ') être to_date ('10 .01.24', 'yy.mm.dd')? –

+0

@Dyno Fu: soit fonctionnera. oracle ne se soucie pas trop de ce que le caractère séparateur est, tant qu'il est là. –

+0

@Dyno Fu: non, ce ne sera pas le cas, mais cela ne fait aucune différence pour Oracle. :( – neverMind

Répondre

3

Le type Oracle DATE stocke une date + heure à la seconde la plus proche - donc si vous dites f.data_entrega = '10.01.24' il ne correspondra pas à un enregistrement où f.data_entrega est 10.01.24 à 6h du matin. SYSDATE, similairement, renvoie l'heure actuelle ainsi que la date d'aujourd'hui.

Si vous voulez que votre fonction correspond à la partie date seulement (c.-à ignorer toutes les valeurs de temps), vous devrez peut-être modifier la fonction:

select f.total_enc_fornec into v_total_enc 
from fornecimento f 
where f.data_entrega between TRUNC(init_date) and TRUNC(final_date) + 0.99999; 
+0

+1, mais syntaxe avec entre pas clair, au moins à des fins d'illustration, '(f.data_entrega> = trunc (init_date)) et (f.data_entrega <(trunc (date_finale) + 1))' – ThinkJet

+0

Merci, cela fonctionne bien, mais que se passe-t-il si je ne veux extraire que les commandes basées sur l'année (mois ou jour)? – neverMind

+2

Vous pouvez restreindre le trunc à l'année/mois/jour: trunc (date) pour le début de la journée; , 'MM') pour le début du mois, trunc (date, 'YYYY') pour le début de l'année –

Questions connexes