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

Langage SQL Discussion :

Récupérer la date la plus proche


Sujet :

Langage SQL

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 77
    Points : 53
    Points
    53
    Par défaut Récupérer la date la plus proche
    Hello!

    Sûrement une bête question mais je vais prendre le plus bête exemple qui soit.
    Imagineons que j'ai une table qui contient une date et un nom, disons une date de naissance et le prénom de la personne et je voudrais retrouver la date de naissance la plus proche ( < à la date recherchée) d'une date donnée.

    Citation Envoyé par Données
    ---------Nom---------Date de naissance---------
    ----------AA--------------01/01/2005-----------
    ----------BB--------------15/04/2005-----------
    ----------CC--------------05/08/2006-----------
    ----------DD--------------09/10/2006-----------
    ----------EE--------------25/09/2007-----------
    ----------FF--------------04/12/2009-----------
    Ici, si la date recherchée est "10/12/2006", le résultat que j'espère trouver est "09/10/2006" car c'est la date la plus proche INFERIEUREMENT.

    Citation Envoyé par Résultat
    ---------DD----------09/10/2006--------------
    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
     
    WITH PERSONNE (NOM, NAISS) AS
    (
    SELECT 'AA', '01/01/2005' union ALL
    SELECT 'BB' , '15/04/2005' union ALL
    SELECT 'CC' , '05/08/2006' union ALL
    SELECT 'DD' , '09/10/2006' union ALL
    SELECT 'EE' , '25/09/2007' union ALL
    SELECT 'FF' , '04/12/2009' 
    )
    SELECT PERSONNE.NOM, PERSONNE.NAISS 
     
    FROM PERSONNE
     
    WHERE ...

  2. #2
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    Bonjour,

    Vous pouvez soustraire la date recherchée à la date de chaque tuple, avec la contrainte que la date recherchée soit supérieure, et que la soustraction soit la plus petite avec la fonction min.

    En gros (dans l'idée et à tester) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    SELECT (DATE_CHERCHEE - T1.date) AS minimum, T1.* 
    from T1
    where T1.date < DATE_CHERCHEE
    Group by minimum
    Having MIN(minimum)

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 77
    Points : 53
    Points
    53
    Par défaut
    En essayant de le faire de cette manière, j'utilise DATEDIFF() vu qu'apparemment il ne peut soustraire 2 dates avec un simple "-".
    Ensuite, je ne peux pas faire de group by de "minimum" car il ne le reconnait pas comme une colonne (surement pcq c'est un alias,et après recherche sur le forum, SQLServer ne permet pas le groupement d'alias).

    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
     
    WITH PERSONNE (NOM, NAISS) AS
    (
    SELECT 'AA', '01-01-2005' union ALL
    SELECT 'BB' , '15-04-2005' union ALL
    SELECT 'CC' , '05-08-2006' union ALL
    SELECT 'DD' , '15-10-2006' union ALL
    SELECT 'EE' , '25-09-2007' union ALL
    SELECT 'FF' , '14-12-2009' 
    )
    SELECT 
    DATEDIFF(day,'01-01-2010', PERSONNE.NAISS) AS minimum,
    PERSONNE.NOM, PERSONNE.NAISS   
    FROM PERSONNE
    WHERE NAISS <= '01-01-2010'
    GROUP BY minimum
    HAVING MIN(minimum)

  4. #4
    Membre averti Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Points : 377
    Points
    377
    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
    13
    14
    15
    16
    WITH PERSONNE (NOM, NAISS) AS
    (
    SELECT 'AA', '01/01/2005' union ALL
    SELECT 'BB' , '15/04/2005' union ALL
    SELECT 'CC' , '05/08/2006' union ALL
    SELECT 'DD' , '09/10/2006' union ALL
    SELECT 'EE' , '25/09/2007' union ALL
    SELECT 'FF' , '04/12/2009' 
    )
    select distinct PERSONNE.NOM, PERSONNE.NAISS 
    where to_date(PERSONNE.NAISS,'DD/MM/YYYY') 
    in (
          SELECT Max(to_date(PERSONNE.NAISS,'DD/MM/YYYY')) 
          FROM PERSONNE
          WHERE to_date(PERSONNE.NAISS,'DD/MM/YYYY') < to_date('10/12/2006','DD/MM/YYYY')
    )

  5. #5
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 77
    Points : 53
    Points
    53
    Par défaut
    Merci, je pense que c'est bon! (je vais tester plusieurs cas )

    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
    WITH PERSONNE (NOM, NAISS) AS
    (
    SELECT 'AA', '2005-01-01' union ALL
    SELECT 'BB' , '2005-04-15' union ALL
    SELECT 'CC' , '2006-08-05' union ALL
    SELECT 'DD' , '2006-10-09' union ALL
    SELECT 'EE' , '2007-09-25' union ALL
    SELECT 'FF' , '2009-12-04' 
    )
    SELECT DISTINCT PERSONNE.NOM, PERSONNE.NAISS 
    FROM PERSONNE
    where PERSONNE.NAISS
    in (
    SELECT Max(PERSONNE.NAISS) 
    FROM PERSONNE
    WHERE PERSONNE.NAISS < '16-12-2006'
    )

  6. #6
    Membre averti Avatar de delphine35
    Femme Profil pro
    Analyste BO
    Inscrit en
    Novembre 2009
    Messages
    265
    Détails du profil
    Informations personnelles :
    Sexe : Femme
    Localisation : Canada

    Informations professionnelles :
    Activité : Analyste BO

    Informations forums :
    Inscription : Novembre 2009
    Messages : 265
    Points : 377
    Points
    377
    Par défaut
    le problème c'est que tes dates sont dans le mauvais sens, on compare les dates sous le format Année Mois Jour et par Jour Mois Année.

    Voir si tu peux pas decouper ta chaine de caractère date de naissance en plusieurs afin de comparer le jour avec le jour, le mois avec le mois et l'année avec l'année, ou de reconstituer la date mais dans le sens Année Mois Jour.

    Je ne connais pas trop sql server .... tu as les fonctions substr ou equivalent ? Désolé de ne pas t'aider plus ....

  7. #7
    Membre averti
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    Points : 313
    Points
    313
    Par défaut
    A priori ce sont des dates, de type DATE et non des chaines de caractères ...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Août 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 77
    Points : 53
    Points
    53
    Par défaut
    C'était bien ça delphine! mercii!

    Sinon, pardon pour les dates, en fait, je fais tellement de choses en même temps que je n'ai pas fait attention que je les avais écris dans le mauvais format (dans la db elles sont dans le bon format "yyyy-MM-dd").
    Désolé

  9. #9
    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 388
    Points
    18 388
    Par défaut
    Il y a un peu plus rapide avec les fonctions de fenêtrage :
    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
    WITH Personne (Nom, Naiss) AS
    (
    SELECT 'AA', convert(smalldatetime, '01/01/2005', 103) union ALL
    SELECT 'BB', convert(smalldatetime, '15/04/2005', 103) union ALL
    SELECT 'CC', convert(smalldatetime, '05/08/2006', 103) union ALL
    SELECT 'DD', convert(smalldatetime, '09/10/2006', 103) union ALL
    SELECT 'EE', convert(smalldatetime, '25/09/2007', 103) union ALL
    SELECT 'FF', convert(smalldatetime, '04/12/2009', 103) 
    )
      ,  Temp (Nom, Naiss, rn) AS
    (
    select Nom, Naiss, row_number() over(order by Naiss desc)
      from Personne
     where Naiss < convert(smalldatetime, '10/12/2006', 103)
    )
    select Nom, Naiss
      from Temp
     where rn = 1;
     
     
    Nom  Naiss
    ---- -----------------------
    DD   2006-10-09 00:00:00

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

Discussions similaires

  1. Date la plus proche d'aujourd'hui
    Par santacrus dans le forum Requêtes et SQL.
    Réponses: 3
    Dernier message: 13/09/2008, 09h52
  2. Date au plus proche
    Par mitchb dans le forum Langage SQL
    Réponses: 1
    Dernier message: 21/07/2008, 11h31
  3. Selectionner la date la plus proche
    Par goodboy dans le forum SQL
    Réponses: 4
    Dernier message: 14/08/2007, 11h36
  4. [MySQL 3.23] Récupérer la date la plus récente
    Par griese dans le forum Langage SQL
    Réponses: 10
    Dernier message: 19/12/2006, 14h19
  5. [FireBird] date la plus proche
    Par gudul dans le forum Langage SQL
    Réponses: 1
    Dernier message: 16/05/2006, 09h09

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