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 :

Calcul de date


Sujet :

SQL Oracle

  1. #1
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Points : 10
    Points
    10
    Par défaut Calcul de date
    Bonjour,

    Le résultat de ma requête me donne ces résultats
    1 | 01/02/2010
    2 | 03/04/2010
    3 | 15/04/2010
    4 | 08/05/2010

    J'ai besoin maintenant de savoir la différence avec la date du dessus

    1 | 01/02/2010 | 0
    2 | 03/04/2010 | 61 jours
    3 | 15/04/2010 | 12 jours
    4 | 08/05/2010 | 23 jours

    Comment je dois m'y prendre ??

    Merci d'avance

  2. #2
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 380
    Points
    18 380
    Par défaut
    En utilisant la fonction LAG :
    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
    With MaTable as
    (
    select 1 as nm, to_date('01/02/2010', 'dd/mm/yyyy') as dt from dual union all
    select 2      , to_date('03/04/2010', 'dd/mm/yyyy')       from dual union all
    select 3      , to_date('15/04/2010', 'dd/mm/yyyy')       from dual union all
    select 4      , to_date('08/05/2010', 'dd/mm/yyyy')       from dual
    )
    select nm, dt,
           dt - lag(dt, 1, dt) over(order by nm asc) as dt_diff
      from MaTable;
     
    NM	DT		DT_DIFF
    1	01/02/2010	0
    2	03/04/2010	61
    3	15/04/2010	12
    4	08/05/2010	23

  3. #3
    Expert éminent sénior 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
    Points : 11 252
    Points
    11 252
    Par défaut
    La différence de deux dates est un nombre de jours.
    Pour accéder à l'enregistrement qui précède l’enregistrement courant vous pouvez utiliser une fonction analytique.

  4. #4
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    PARFAIT !!!
    Merci à vous pour les réponses et pour la réactivité !!


  5. #5
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Je suis allé un peu vite sur la cloture du post

    j'avais oublié un paramètre....j'ai plusieurs clients

    Voilà ma requête maintenant

    select
    row_number() over (partition by code_clt order by code_clt) rn,
    code_clt,
    dateliv,
    qte,
    LAG( dateliv, 1, dateliv) OVER (partition by code_clt ORDER BY code_clt) AS DATE_PRECEDENTE,
    dateliv-(LAG( dateliv, 1, dateliv) OVER (partition by code_clt ORDER BY code_clt)) as DIFF
    from LIVRAISON

    et le résultat qui est nickel

    1 | CLT1 | 01/02/2010 |01/02/2010 |0
    2 | CLT1 | 03/04/2010 |01/02/2010 | 61 jours
    3 | CLT1 | 15/04/2010 |03/04/2010 | 12 jours
    4 | CLT1 | 08/05/2010 |15/04/2010 | 23 jours
    1 | CLT2 | 01/06/2005 |01/06/2005 |0
    2 | CLT2 | 25/07/2005 |01/06/2005 | 54 jours
    3 | CLT2 | 09/10/2007 |25/07/2005 | 806 jours

    Ce que j'ai besoin c'est d'une moyenne au fur et à mesure du temps...et par client...et là ça bloque...car j'ai besoin d'utiliser le résultat de la fonction LAG...et il apprécie pas apparemment...

    1 | CLT1 | 01/02/2010 |01/02/2010 |0 | 0
    2 | CLT1 | 03/04/2010 |01/02/2010 | 61 jours | 61
    3 | CLT1 | 15/04/2010 |03/04/2010 | 12 jours | 36.5
    4 | CLT1 | 08/05/2010 |15/04/2010 | 23 jours | 32
    1 | CLT2 | 01/06/2005 |01/06/2005 |0 | 0
    2 | CLT2 | 25/07/2005 |01/06/2005 | 54 jours | 54
    3 | CLT2 | 09/10/2007 |25/07/2005 | 806 jours | 430

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2009
    Messages : 11
    Points : 10
    Points
    10
    Par défaut
    Ok j'ai trouvé...

  7. #7
    Rédacteur

    Homme Profil pro
    Consultant / formateur Oracle et SQL Server
    Inscrit en
    Décembre 2002
    Messages
    3 460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Var (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant / formateur Oracle et SQL Server

    Informations forums :
    Inscription : Décembre 2002
    Messages : 3 460
    Points : 8 077
    Points
    8 077
    Par défaut
    Citation Envoyé par elcommendatore Voir le message
    Ok j'ai trouvé...
    Dans ce cas n'hésitez pas à donner votre solution finale, qui pourra intéresser ceux qui auraient un besoin similaire...
    Consultant / formateur Oracle indépendant
    Certifié OCP 12c, 11g, 10g ; sécurité 11g

    Ma dernière formation Oracle 19c publiée sur Linkedin : https://fr.linkedin.com/learning/oracle-19c-l-administration

  8. #8
    Modérateur
    Avatar de Waldar
    Homme Profil pro
    Sr. Specialist Solutions Architect @Databricks
    Inscrit en
    Septembre 2008
    Messages
    8 453
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    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 453
    Points : 18 380
    Points
    18 380
    Par défaut
    De mon côté j'ai procédé ainsi :
    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
    WITH MaTable AS
    (
    SELECT 1 AS nm, 'CLT1' as cl, to_date('01/02/2010', 'dd/mm/yyyy') AS dt FROM dual union ALL
    SELECT 2      , 'CLT1'      , to_date('03/04/2010', 'dd/mm/yyyy')       FROM dual union ALL
    SELECT 3      , 'CLT1'      , to_date('15/04/2010', 'dd/mm/yyyy')       FROM dual union ALL
    SELECT 4      , 'CLT1'      , to_date('08/05/2010', 'dd/mm/yyyy')       FROM dual union ALL
    SELECT 5      , 'CLT2'      , to_date('01/06/2005', 'dd/mm/yyyy')       FROM dual union ALL
    SELECT 6      , 'CLT2'      , to_date('25/07/2005', 'dd/mm/yyyy')       FROM dual union ALL
    SELECT 7      , 'CLT2'      , to_date('09/10/2007', 'dd/mm/yyyy')       FROM dual
    )
    SELECT nm, dt,
           dt - lag(dt, 1, dt) over(partition by cl ORDER BY nm ASC) AS dt_diff,
           case count(*) over(partition by cl order by nm asc)
             when 1 then 0
             else (dt - first_value(dt) over(partition by cl order by nm asc))
                  / (count(*) over(partition by cl order by nm asc) -1)
           end as moy
      FROM MaTable;
     
    NM	DT		DT_DIFF	MOY
    1	01/02/2010	0	0
    2	03/04/2010	61	61
    3	15/04/2010	12	36.5
    4	08/05/2010	23	32
    5	01/06/2005	0	0
    6	25/07/2005	54	54
    7	09/10/2007	806	430

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

Discussions similaires

  1. [Calendar]Problème de calcul de date
    Par valerie90 dans le forum Collection et Stream
    Réponses: 6
    Dernier message: 08/12/2004, 12h13
  2. COUNT + Calcul de DATE
    Par cassi2 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 28/10/2004, 16h35
  3. Resutlat de calcul sur date formaté
    Par neness dans le forum SQL
    Réponses: 6
    Dernier message: 16/06/2004, 15h34
  4. SCRIPT CALCULANT LA DATE
    Par Redouane dans le forum ASP
    Réponses: 3
    Dernier message: 17/03/2004, 09h10
  5. Calcul sur date
    Par Thomad dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 17/09/2003, 08h55

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