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 :

Dates antérieures


Sujet :

SQL Oracle

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2013
    Messages : 25
    Par défaut Dates antérieures
    Bonjour à tous

    Je sollicite votre aide pour une requête qui doit m'extraire des données en remontant à partir de la date du jour , les 5 jours antérieurs.
    Dans ma requête jusqu'à présent j'avais cela :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where demande.datenreg between to_char(current_date, 'YYMMDD')-5 and to_char(current_date,'YYMMDD')
    cela fonctionnait à merveille je précise et vous allez comprendre pourquoi ma demande, requête créé donc le 13/04/2019.

    Aujourd'hui 1 Mai , la même requête me ramène que les données du 1er Mai mais non les données du 26-27-28-29-30 avril comme attendu !

    Merci pour votre retour.

    Cordialement.

  2. #2
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 960
    Par défaut
    Pourquoi convertir la date en chaine ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT SYSDATE AS current_date,
           SYSDATE + 1 AS plus_1_day,
           SYSDATE + 1/24 AS plus_1_hours,
           SYSDATE - interval '5' day
    from dual;
    et voir ici (selon la version) : https://docs.oracle.com/cd/E41183_01/DR/Dateadd.html

  3. #3
    Membre averti
    Homme Profil pro
    Responsable de service informatique
    Inscrit en
    Juin 2013
    Messages
    25
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Réunion

    Informations professionnelles :
    Activité : Responsable de service informatique

    Informations forums :
    Inscription : Juin 2013
    Messages : 25
    Par défaut
    Rebonjour et merci pour votre retour.
    Je vous mets la requête complète qui fonctionnait au mois d'Avril
    Je la place ou ? le select Sysdate SVP

    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
    select 
     SUBSTR(DEMANDE.DATENREG,5,2)||'/'||SUBSTR(DEMANDE.DATENREG,3,2)||'/'|| SUBSTR(DEMANDE.DATENREG,1,2) AS "DATE"
    ,SUBSTR(DEMANDE.DATENREG,5,2)||'/'||SUBSTR(DEMANDE.DATENREG,3,2)||'/'|| SUBSTR(DEMANDE.DATENREG,1,2)||'-'||SUBSTR(DEMANDE.NODEMX,7,1)||'-'||SUBSTR(DEMANDE.NODEMX,8,4) AS DOSSIER
    ,PATIENT.NOM || ' ' || PATIENT.PRENOM AS PATIENT 
    ,DEMANDE.NOHOSP AS HOSPITALISATION
    ,prescript.ipresc As MÉDECIN
    ,v_hd_activitenetteparacte.codecorrespondant as "CORRESPONDANT"
    ,v_hd_activitenetteparacte.lettrecle As "LETTRE CLE"
    ,sum(nbb)As "TOTAL B"
    ,sum(ca/100) As "MONTANT DOSSIER"
    , listagg( v_hd_activitenetteparacte.acte,'-') within group (order by acte desc) As "CODE AFFINÉ"
     
    from v_hd_activitenetteparacte
    join demande on demande.nodem= v_hd_activitenetteparacte.IDDOSSIER
    and  V_HD_ACTIVITENETTEPARACTE.version=demande.VERSION
    Join patient on demande.nopat=patient.nopat
    join appresc on appresc.nodem=demande.nodem
     join prescript on prescript.cpresc=appresc.cpresc
     and appresc.nordre='O'
     
     
    where demande.datenreg between to_char(current_date, 'YYMMDD')-10 and to_char(current_date,'YYMMDD') 
    and v_hd_activitenetteparacte.CODECORRESPONDANT in ('CDSC','CDOR','CDLP')
    and demande.clabo='1'
     
    group by
    SUBSTR(DEMANDE.DATENREG,5,2)||'/'||SUBSTR(DEMANDE.DATENREG,3,2)||'/'|| SUBSTR(DEMANDE.DATENREG,1,2)
    ,SUBSTR(DEMANDE.DATENREG,5,2)||'/'||SUBSTR(DEMANDE.DATENREG,3,2)||'/'|| SUBSTR(DEMANDE.DATENREG,1,2)||'-'||SUBSTR(DEMANDE.NODEMX,7,1)||'-'||SUBSTR(DEMANDE.NODEMX,8,4) 
    , PATIENT.NOM || ' ' || PATIENT.PRENOM 
    ,v_hd_activitenetteparacte.CODECORRESPONDANT
    ,v_hd_activitenetteparacte.LETTRECLE
    ,DEMANDE.NOHOSP 
    ,PRESCRIPT.IPRESC
     
    order by
    PATIENT.NOM || ' ' || PATIENT.PRENOM

  4. #4
    Membre Expert
    Homme Profil pro
    Chef de projet MOA
    Inscrit en
    Février 2012
    Messages
    652
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Morbihan (Bretagne)

    Informations professionnelles :
    Activité : Chef de projet MOA
    Secteur : Distribution

    Informations forums :
    Inscription : Février 2012
    Messages : 652
    Par défaut
    Bonjour,


    Merci d'utiliser les balises de codes lorsque vous en postez.

    Que donne cette requête ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select datenreg, COUNT(*)
    from demande 
    where datenreg between TRUNC(sysdate)-10 and TRUNC(sysdate)
    group by datenreg
    order  by datenreg

  5. #5
    Expert confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    2 953
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2008
    Messages : 2 953
    Par défaut
    Vous utilisez très mal le type de donnée date, ce qui conduit à de multiples conversions implicites :
    to_char(current_date, 'YYMMDD') renvoie une chaine de caractère 190501 au 1er mai.
    to_char(current_date, 'YYMMDD')-5 convertit implicitement 190501 en nombre et retire 5 => 190496 => Gros problème, n'est-ce pas !

    Si vous voulez remonter les données du jour courant modifier votre between en :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    where demande.datenreg >= trunc(current_date) - 5 and demande.datenreg < trunc(current_date) + 1 -- si les données du jour courant sont à exclure retirer le +1
    Idem dans votre SELECT, vous faites des SUBSTR en fonction de l'affichage de la date dépend de votre paramétrage de session.

    Modifez :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUBSTR(DEMANDE.DATENREG,5,2)||'/'||SUBSTR(DEMANDE.DATENREG,3,2)||'/'|| SUBSTR(DEMANDE.DATENREG,1,2)
    en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    to_char(DEMANDE.DATENREG,'dd/mm/yyyy')
    Et d'une manière générale, sauf si particulièrement imposé par le métier, travailler avec l'année sur 4 caractères et non 2.

  6. #6
    Membre Expert
    Homme Profil pro
    Architecte de base de données
    Inscrit en
    Septembre 2016
    Messages
    960
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 58
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Architecte de base de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2016
    Messages : 960
    Par défaut
    Sur ce forum on est nombreux à insister sur la "présentation" du code (même si on n'est pas tous d'accord sur l'implémentation)
    J'en fais partie.
    Lorsqu'une requête est longue, il est important de faciliter la relecture du code, donc sa maintenance.

    En tenant compte des contributions je te propose une façon de réécrire ta requête.
    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
    44
    45
    SELECT   temp."DATE" 
            ,temp.dossier 
            ,temp.patient 
            ,temp.hospitalisation 
            ,temp.MÉDECIN 
            ,temp.correspondant 
            ,temp."LETTRE CLE" 
            ,Sum(temp.nbb)                                            AS "TOTAL B" 
            ,Sum(temp.ca/100)                                         AS "MONTANT DOSSIER" 
            ,Listagg(temp.acte,'-') within GROUP (ORDER BY acte DESC) AS "CODE AFFINÉ"
    FROM (
            SELECT   to_char(d.datenreg, 'YYYYMMDD')    AS "DATE" 
                    ,concat_ws('-',to_char(d.datenreg, 'YYYYMMDD'),substr(d.nodemx,7,1),substr(d.nodemx,8,4) AS dossier 
                    ,p.nom||' '|| p.prenom              AS patient 
                    ,d.nohosp                           AS hospitalisation 
                    ,pr.ipresc                          AS MÉDECIN 
                    ,vha.codecorrespondant              AS "CORRESPONDANT" 
                    ,vha.lettrecle                      AS "LETTRE CLE" 
                    ,???.nbb                            AS nbb 
                    ,???.ca                             AS ca 
                    ,vha.acte                           AS acte 
            FROM v_hd_activitenetteparacte vha
                JOIN demande d
                    ON  d.nodem  =vha.iddossier
                    AND d.version=vha.version
                JOIN patient p
                    ON d.nopat=p.nopat
                JOIN appresc a
                    ON a.nodem=d.nodem
                JOIN prescript pr
                    ON pr.cpresc=a.cpresc 
            WHERE d.datenreg BETWEEN d.datenreg-10 AND CURRENT_DATE
                  AND vha.codecorrespondant IN ('CDSC','CDOR','CDLP')
                  AND d.clabo='1'
                  AND a.nordre='O' 
         ) temp
    GROUP BY 
             temp."DATE" 
            ,temp.dossier 
            ,temp.patient 
            ,temp.hospitalisation 
            ,temp.MÉDECIN 
            ,temp.correspondant 
            ,temp."LETTRE CLE" 
    ORDER BY temp.patient
    Il faut remplacer les ??? par le bon l'alias.

    Rappel : On n'est pas tous d'accord sur CE formalisme mais on est d'accord sur le fait d'en adopter.

    Fait la comparaison entre le code initial et celui-ci et tires en tes conclusions.

Discussions similaires

  1. SQL - Calcul de DATE sur Oracle 11g
    Par Djene dans le forum SQL
    Réponses: 2
    Dernier message: 09/08/2013, 17h36
  2. [D6 FB 1.5] Retrouver les dates antérieures à une autre
    Par Lucien dans le forum Bases de données
    Réponses: 4
    Dernier message: 20/01/2006, 09h28
  3. conversion de date (delphi/oracle)
    Par dolphins dans le forum Bases de données
    Réponses: 1
    Dernier message: 26/09/2005, 16h15
  4. [MFC] Date antérieure à 1752
    Par Nicolas Bauland dans le forum MFC
    Réponses: 2
    Dernier message: 17/12/2004, 23h16
  5. Réponses: 9
    Dernier message: 17/01/2004, 10h51

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