IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SQL Oracle Discussion :

lister des dates manquantes entre 2 bornes


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9
    Par défaut lister des dates manquantes entre 2 bornes
    Bonjour,

    j'ai une table avec une colonne date, et je voudrais vérifier qu'il existe bien des données pour tous les jours entre 2 bornes données . Peut-on écrire une requête SQL qui sort en résultat la liste des dates qui n'existent pas dans la table (entre 2 bornes)

    Merci pour vos suggestions!

  2. #2
    Expert éminent
    Avatar de orafrance
    Profil pro
    Inscrit en
    Janvier 2004
    Messages
    15 967
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

    Informations forums :
    Inscription : Janvier 2004
    Messages : 15 967
    Par défaut
    Ca a été traité plusieurs fois il me semble, essaye de faire une recherche dans le forum.

  3. #3
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 454
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Sr. Specialist Solutions Architect @Databricks
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2008
    Messages : 8 454
    Par défaut
    Il faut implémenter une table calendrier dans votre base de données.

    Néanmoins en test, vous pouvez ruser avec ce genre de sous-requête :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select to_date('072009', 'mmyyyy') + level - 1 as dt
    from dual
    connect by level <= to_date('082009', 'mmyyyy') - to_date('072009', 'mmyyyy')

  4. #4
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    var dt_debut varchar2(10)
    var dt_fin varchar2(10)
    exec :dt_debut:='2009-01-01';
    exec :dt_fin:='2009-01-15';
     
    SELECT     to_date(:dt_debut,'yyyy-mm-dd') + LEVEL - 1 dt
          FROM DUAL
    CONNECT BY LEVEL <= to_date(:dt_fin,'yyyy-mm-dd') - to_date(:dt_debut,'yyyy-mm-dd') + 1
    MINUS
    SELECT col1
      FROM your_table

  5. #5
    Membre habitué
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    9
    Détails du profil
    Informations personnelles :
    Âge : 58
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 9
    Par défaut merci


    ok merci je ne connaissais pas cette utilisation de level, et cette solution me va très bien.

    Désolée aussi, je n'ai pas été très douée pour utiliser le moteur de recherche, je ferais mieux la prochaine fois...

  6. #6
    Expert confirmé Avatar de mnitu
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2007
    Messages
    5 611
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Marne (Champagne Ardenne)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Octobre 2007
    Messages : 5 611
    Par défaut
    Ou une petite fonction pipelined
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    SELECT to_date('072009', 'mmyyyy') + column_value - 1 AS dt
    FROM table (row_generator(to_date('082009', 'mmyyyy') - to_date('072009', 'mmyyyy')))

  7. #7
    Rédacteur

    Homme Profil pro
    Développeur et DBA Oracle
    Inscrit en
    Octobre 2006
    Messages
    878
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Algérie

    Informations professionnelles :
    Activité : Développeur et DBA Oracle

    Informations forums :
    Inscription : Octobre 2006
    Messages : 878
    Par défaut
    Or avec la 10g
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    var dt_debut varchar2(10)
    var dt_fin varchar2(10)
    exec :dt_debut:='2009-01-01';
    exec :dt_fin:='2009-01-15';
     
    select dt_debut
    from dual 
    model 
    dimension by ( 1 rn)
    measures(to_date(:dt_debut,'yyyy-mm-dd') dt_debut, 
             to_date(:dt_fin,'yyyy-mm-dd')-to_date(:dt_debut,'yyyy-mm-dd')+1 diff)
    (dt_debut[ for rn from 1 to diff[1] increment 1]=dt_debut[1]+cv(rn)-1)
    MINUS
    SELECT col1
      FROM your_table
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
     
    SQL> var dt_debut varchar2(10)
    SQL> var dt_fin varchar2(10)
    SQL> exec :dt_debut:='2009-01-01';
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> exec :dt_fin:='2009-01-15';
     
    Procédure PL/SQL terminée avec succès.
     
    SQL> select dt_debut
      2  from dual 
      3  model 
      4  dimension by ( 1 rn)
      5  measures(to_date(:dt_debut,'yyyy-mm-dd') dt_debut, 
      6           to_date(:dt_fin,'yyyy-mm-dd')-to_date(:dt_debut,'yyyy-mm-dd')+1 diff)
      7  (dt_debut[ for rn from 1 to diff[1] increment 1]=dt_debut[1]+cv(rn)-1);
     
    DT_DEBUT
    ----------
    2009-01-01
    2009-01-02
    2009-01-03
    2009-01-04
    2009-01-05
    2009-01-06
    2009-01-07
    2009-01-08
    2009-01-09
    2009-01-10
    2009-01-11
     
    DT_DEBUT
    ----------
    2009-01-12
    2009-01-13
    2009-01-14
    2009-01-15
     
    15 ligne(s) sélectionnée(s).
     
    SQL>

  8. #8
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Par défaut
    Citation Envoyé par SOLEDAD29 Voir le message
    Bonjour,

    j'ai une table avec une colonne date, et je voudrais vérifier qu'il existe bien des données pour tous les jours entre 2 bornes données . Peut-on écrire une requête SQL qui sort en résultat la liste des dates qui n'existent pas dans la table (entre 2 bornes)

    Merci pour vos suggestions!
    Moi je préfère minus

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    create table lsc_t(d date primary key);
    exec for i in 1..30000 loop insert into lsc_t values (date '1960-01-01'+i);end loop
     
    select d from lsc_t where d between date '1981-02-19' and date '1981-02-22'
    minus    
    select hiredate from lsc_emp where hiredate between date '1981-02-19' and date '1981-02-22'; 
    D        
    ---------
    19-FEB-81
    21-FEB-81
    c'est beaucoup plus lisible et très performant. Quant à l'espace nécessaire pour stocker toutes les dates entre ta naissance et ta mort, c'est quelques kilooctets

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Générer des nombres aléatoires entre 2 bornes
    Par Isabella83 dans le forum C
    Réponses: 6
    Dernier message: 18/04/2015, 11h14
  2. Ajout des dates manquantes dans une requete
    Par olibara dans le forum Développement
    Réponses: 4
    Dernier message: 08/04/2014, 15h00
  3. [XL-2007] Insertion automatique des lignes des dates manquantes
    Par TraderAS dans le forum Macros et VBA Excel
    Réponses: 7
    Dernier message: 10/04/2013, 11h10
  4. Peut-on retracer des dates manquantes ?
    Par samlepiratepaddy dans le forum Access
    Réponses: 1
    Dernier message: 30/11/2005, 12h41
  5. Obtenir des enregistrements compris entre 2 dates
    Par rangernoir dans le forum Access
    Réponses: 2
    Dernier message: 29/09/2005, 13h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo