Précédent   Forum des professionnels en informatique > Bases de données > Oracle > SQL
SQL Forum d'entraide sur le SQL pour Oracle
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 12/12/2011, 11h37   #1
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Par défaut Nombre de jours ouvrés entre 2 dates

Bonjour,

Je souhaite être à même de déterminer le nombre de jours ouvrés (Lundi à Vendredi) entre 2 dates.
Y a t-il un moyen simple de réaliser cette requête ?
Je suis sur Oracle 11g.


Julien.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h18   #2
Membre actif
 
Avatar de Jean_Benoit
 
Inscription : juin 2004
Messages : 495
Détails du profil
Informations personnelles :
Âge : 58

Informations forums :
Inscription : juin 2004
Messages : 495
Points : 182
Points : 182
Bonjour,

J'ai utilisé le format 'D'.
J'ai une solution par une function pl/sql.

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
CREATE OR REPLACE FUNCTION jours_ouvres ( prem date, dern date )
RETURN number IS
 
  ld_date_courante  date;
  ln_intervalle     number(6) := 0;
  ln_compteur       number(6) := 0;
 
begin
 
  ln_intervalle :=  ( dern - prem ) + 1;
 
  FOR k IN 1..ln_intervalle loop
     ld_date_courante := prem + ( k - 1 );
 
     IF to_char ( ld_date_courante, 'D' ) IN ( '1', '2', '3', '4', '5' ) then
        ln_compteur := ln_compteur +  1;
     end IF;
 
  end loop;
 
  RETURN ln_compteur;
end;
Code :
1
2
3
4
5
6
SELECT empno, 
       hiredate,
       date_mutation,
       jours_ouvres( hiredate, date_mutation )
FROM   jbmemp
ORDER BY hiredate DESC nulls last
Jean_Benoit est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 12/12/2011, 12h23   #3
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
C'est ce que je pensais faire mais n'y a t-il rien d'autre du style ce qu'il y a sur excel ?

Merci quand même.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h30   #4
Membre Expert
 
Avatar de lola06
 
Femme Laure
Consultante en Business Intelligence
Inscription : avril 2007
Messages : 983
Détails du profil
Informations personnelles :
Nom : Femme Laure
Âge : 25
Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

Informations professionnelles :
Activité : Consultante en Business Intelligence
Secteur : Conseil

Informations forums :
Inscription : avril 2007
Messages : 983
Points : 1 693
Points : 1 693
Bonjour,

Peut-être pourrais-tu préciser ce qu'il y a sur Excel que tu voudrais faire ici ?

En quoi la solution précédente ne te convient pas ? Elle répond à ta demande pourtant.
__________________
~ Lola ~

Ne pas oublier :
et aussi :
lola06 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 12h36   #5
Membre chevronné
 
Avatar de pinocchio
 
Homme François
Développeur informatique
Inscription : novembre 2002
Messages : 773
Détails du profil
Informations personnelles :
Nom : Homme François
Âge : 35
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Développeur informatique
Secteur : Service public

Informations forums :
Inscription : novembre 2002
Messages : 773
Points : 787
Points : 787
Je pense qu'il fait référence à une fonction sur Excel qui effectue le calcul directement entre deux dates.
Cette fonction a en plus comme paramètre la possibilité d'indiquer une liste de valeurs correspondant à des jours fériés sur l'intevalle.
Pour ORACLE, je ne connais pas l'identique sans passer par du PL/SQL comme indiqué précédemment.
Cordialement
__________________
La SNCF est mon ami
blog PARIS-GRANVILLE
Inscription au panel IPSOS (possibilité d'avoir des bons d'achats)
pinocchio est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 13h32   #6
Membre habitué
 
Inscription : novembre 2008
Messages : 238
Détails du profil
Informations forums :
Inscription : novembre 2008
Messages : 238
Points : 120
Points : 120
Mon collègue m'avait parlé de joursem mais je ne vois pas comment il peut combiner facilement datediff et joursem sauf à faire de la programmation vba ce qui équivaut à ce que vous proposez.
Je vais donc utiliser la fonction.

Merci.
Julien.
juju05 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/12/2011, 13h40   #7
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
Attention 'd' est déterminer par le NLS_TERRITORY, en fonction de ce paramètre de session lundi est 1 ou 2.
Datetime Format Models
Citation:
The language in which these values are returned is specified either explicitly with the initialization parameter NLS_DATE_LANGUAGE or implicitly with the initialization parameter NLS_LANGUAGE. The values returned by the YEAR and SYEAR datetime format elements are always in English.

The datetime format element D returns the number of the day of the week (1-7). The day of the week that is numbered 1 is specified implicitly by the initialization parameter NLS_TERRITORY.
Je conseille plutôt d'utiliser 'DAY' afin de fixer la langue dans le SQL quelque soit les paramêtres de sessions.
Code :
to_char(ladate, 'DAY', 'NLS_DATE_LANGUAGE=FRENCH')
L'idéal est d'avoir une table calendrier qui détermine les jours WE, fériés...
Un point de départ à améliorer (pour les jours de 01/01/2000 à 31/12/2050):
Code :
1
2
3
4
5
6
CREATE TABLE calendar AS 
SELECT to_date('01/01/2000','dd/mm/yyyy') + rownum AS dt, 
       to_char(to_date('01/01/2000','dd/mm/yyyy') + rownum, 'DAY', 'NLS_DATE_LANGUAGE=FRENCH') AS jour,
       case when trim(to_char(to_date('01/01/2000','dd/mm/yyyy') + rownum, 'DAY', 'NLS_DATE_LANGUAGE=FRENCH')) IN ('SAMEDI','DIMANCHE') then 'WE' end AS WE
  FROM dual
connect BY level <= (to_date('01/01/2051','dd/mm/yyyy') - to_date('01/01/2000','dd/mm/yyyy')) -1
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 30
Vieux 02/01/2012, 18h12   #8
Rédacteur
 
Inscription : décembre 2002
Messages : 2 389
Détails du profil
Informations personnelles :
Localisation : France, Var (Provence Alpes Côte d'Azur)

Informations forums :
Inscription : décembre 2002
Messages : 2 389
Points : 3 276
Points : 3 276
Citation:
Envoyé par skuatamad Voir le message
Je conseille plutôt d'utiliser 'DAY' afin de fixer la langue dans le SQL quelque soit les paramêtres de sessions.
Code :
to_char(ladate, 'DAY', 'NLS_DATE_LANGUAGE=FRENCH')
fmDAY est encore mieux à mon goût ; il rend inutile le TRIM par la suite, ce qui allège un brin la syntaxe.
__________________
Consultant / formateur Oracle indépendant
Certifié OCP 10g et 11g, sécurité 11g
Pomalaix est déconnecté   Envoyer un message privé Réponse avec citation 20
Vieux 02/01/2012, 20h15   #9
Membre Expert
 
Inscription : août 2008
Messages : 1 271
Détails du profil
Informations forums :
Inscription : août 2008
Messages : 1 271
Points : 1 928
Points : 1 928
Effectivement, merci Pomalaix pour cette précision, ça m'a permis d'aller vérifier à quoi correspondait FM que je ne connaissais pas
skuatamad est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h30.


 
 
 
 
Partenaires

Hébergement Web