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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 77
    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 chevronné
    Inscrit en
    Avril 2010
    Messages
    239
    Détails du profil
    Informations forums :
    Inscription : Avril 2010
    Messages : 239
    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 confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 77
    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 chevronné 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
    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 confirmé
    Profil pro
    Inscrit en
    Août 2008
    Messages
    77
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Belgique

    Informations forums :
    Inscription : Août 2008
    Messages : 77
    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 chevronné 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
    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 ....

+ 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