2013-05-03 7 views
2

Existe-t-il un moyen "facile" de calculer le nombre de jours entre deux dates (par exemple, je voulais connaître le nombre de mardis entre le 1er janvier 2000 et aujourd'hui)? De plus, la même question s'applique plus largement aux différentes unités (par exemple, combien de 2pms entre deux dates, combien de février, combien de 21 Auguste, etc.) ... Le meilleur que j'ai trouvé (pour les jours entre les dates) est la suivante:Nombre de jours particuliers entre deux dates

with calendar as (
    select  to_char(:start + level - 1, 'DAY') dayOfWeek 
    from  dual 
    connect by level <= ceil(:end - :start) 
) 
select dayOfWeek, count(dayOfWeek) 
from  calendar 
group by dayOfWeek; 

Je dois créer une vue de ce - hardcoding les dates de début et de fin - pour le rendre pratique (ish) à utiliser; soit cela ou écrire une fonction pour faire le sale boulot. Ce ne serait pas difficile, mais je me demande s'il y a déjà une fonction Oracle qui pourrait le faire, ce qui représente pour des choses comme jours bissextiles, etc.


EDITThis surgissaient dans les liens connexes lorsque J'ai posté ceci. Cela répond plus ou moins à la question pendant des jours et je sais qu'il y a une fonction months_between que je pourrais utiliser pendant des mois particuliers. D'autres fonctions connexes que je devrais connaître?

+1

Voir http://docs.oracle.com/cd/E11882_01/server.112/e26088/functions002.htm#i88891 pour la liste des fonctions de date Oracle. –

+1

Construisez-vous un [Calendrier] (http://www.perpendulum.com/2012/06/calendar-table-script-for-oracle/) et tous vos problèmes de date disparaîtront. – GarethD

Répondre

1

Remplacez les dates de début/fin par vos dates. Ce numéro de calc de requête de Jan MAR. 1-2013 jusqu'à aujourd'hui, ce qui est 18:

SELECT count(*) number_of_tue 
    FROM 
(
SELECT TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL-1 start_dt 
     , To_Char(TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL - 1, 'DY') wk_day 
     , To_Char(TRUNC(TO_DATE(Sysdate), 'YEAR') + LEVEL - 1, 'D') wk_day# 
     , trunc(Sysdate) end_dt 
    FROM DUAL 
CONNECT BY LEVEL <= trunc(Sysdate) - trunc(Sysdate, 'YEAR') -- replace with your start/end dates 
) 
WHERE wk_day# = 3 -- OR wk_day = 'TUE' -- 
/
+0

Merci, mais en quoi est-ce différent de ma requête? Vous utilisez simplement une sous-requête plutôt qu'un CTE. – Xophmeister

+0

Il n'y a pas de diff. ce que vous appelez CTE ou ma requête. Je n'ai pas vérifié votre requête avant de poster la mienne. Ma requête a plus de dates à tester et voir les dates réelles, et le jour de la semaine etc ... Choisissez quelqu'un pour créer une vue. Cela ne peut pas être plus facile que cela. – Art