none
Problème de gestion de date RRS feed

  • Question

  • Bonjour,

    J'ai une requête dans laquelle je voudrais récupérer toutes les lignes dont la date est ultérieure ou égale à celle d'aujourd'hui.

    Or cela fonctionne très bien dès demain, mais pour aujourd'hui, rien à faire...

    Voici mon code :

    select (...),Date_Fin, (...) where (...) Date_Fin>=now() order by Date_Fin asc

    Comme je le disais, ça me renvoie toutes les lignes ayant pour date le jour suivant now(), mais rien dès lors que la valeur est la même?

    Que faire, je désespère!!

    Cordialement


    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!
    • Déplacé Alex Petrescu lundi 7 février 2011 13:39 access (Origine :Visual Basic)
    mercredi 2 février 2011 16:16

Réponses

  • Bonjour,

    Une solution peut être

    En mode création remplacer dans la colonne "[Date_Fin]" la condition ">=Now()" par >=SérieDate(Année(Maintenant());Mois(Maintenant());Jour(Maintenant()))

    Voici la syntaxe SQL

    SELECT Table1.Nom, Table1.[Date_Fin]
    FROM Table1
    WHERE (((Table1.[Date_Fin])>=DateSerial(Year(Now()),Month(Now()),Day(Now()))))
    ORDER BY Table1.[Date_Fin];
    
    

     


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users
    • Marqué comme réponse guznat mardi 8 février 2011 09:17
    lundi 7 février 2011 14:42

Toutes les réponses

  • Bonjour,

    J'ai un peu cherché, et je n'ai pas trouvé de solution miracle.

    La seule chose que j'ai trouvé, c'est ça :

    SELECT * FROM MaTable WHERE Date_Fin>= CAST(FLOOR( CAST( GETDATE() AS FLOAT ) )AS DATETIME)
    

    Pour l'explication, en castant la date en float, on a les jours qui sont des entiers, et les heures, minutes et secondes qui sont des décimales. En arrondissant, on supprime toutes les heures, et on se place à Oh de la journée d'aujourd'hui, ce qui permet lors des comparaisons du SELECt, de sortir aussi les lignes d'aujourd'hui.

    Cordialement,

    Thomas

     

     

     


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    mercredi 2 février 2011 16:40
  • Sinon, une autre idée, peut-être, plutôt que de faire un CAST en float, un FLOOR et un autre CAST, cela peut marcher avec ceci aussi.

    Conversion en passant par un VARCHAR, ce qui devrait tronquer la partie Heures / Minutes / Secondes de la DATETIME :

    CAST(CONVERT(VARCHAR(10), GETDATE(), 111) AS DATETIME)
    
    Peut-être plus rapide, ou plus lent, à tester.

    Cordialement,

    Thomas


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    mercredi 2 février 2011 16:53
  • Bonsour®

    "guznat" a écrit

    J'ai une requête dans laquelle je voudrais récupérer toutes les lignes dont la
    date est ultérieure ou égale à celle d'aujourd'hui.
    Or cela fonctionne très bien dès demain, mais pour aujourd'hui, rien à faire...
    Voici mon code :
    select (...),Date_Fin, (...) where (...) Date_Fin>=now() order by Date_Fin asc

    Date_fin est-il de type Integer ???
    Now() est de type décimal !!!

    select (...),Date_Fin, (...) where (...) Date_Fin>=Int(now()) order by Date_Fin asc
    ou
    select (...),Date_Fin, (...) where (...) Date_Fin>=today() order by Date_Fin asc


    Maude Este
    jeudi 3 février 2011 12:50
  • Bonjour,

    Après avoir testé les deux méthodes, cela ne fonctionne toujours pas.

    A priori, la solution consisterait peut-être à faire des datepart jour, mois et années pour Datefin et pour now et de les comparer après la requête.


    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!
    jeudi 3 février 2011 13:47
  • Bonjour,

    J'ai essayé avec today() et ça me renvoie une erreur au moment de l'exécution.

    Il faut dire que l'on m'a imposé de travailler avec access qui n'accepte pas toutes les fonctions sql...

    Cordialement.


    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!
    jeudi 3 février 2011 13:49
  • Bonjour,

    Ah, t'es sous Access ?

    Ben dans ce cas, modifie ta requête, et fais :

    SELECT * FROM MaTable WHERE
    DATEPART("yyyy",Date_Fin)>DATEPART("yyyy",now()) OR
    DATEPART("yyyy",Date_Fin)=DATEPART("yyyy",now()) AND DATEPART("m",Date_Fin)>DATEPART("m",now()) OR
    DATEPART("yyyy",Date_Fin)=DATEPART("yyyy",now()) AND DATEPART("m",Date_Fin)=DATEPART("m",now()) AND DATEPART("d",Date_Fin)>=DATEPART("d",now())
    

    Cordialement,

    Thomas

     


    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr
    jeudi 3 février 2011 16:46
  • Bonjour,

     

    Si il s'agit de requête SQL vous avez un forum qui est fait pour ou je pense il y a plus de personnes compétentes pour apporter une solution a votre problème

    http://social.msdn.microsoft.com/Forums/fr-FR/sqlserverfr/threads

    A bientot


    Cordialement, Troxsa
    jeudi 3 février 2011 17:11
  • Bonjour guznat,

    Comme le SGDB est Access, je pense que l'un des meilleurs forum serait :

    http://social.msdn.microsoft.com/Forums/fr-FR/accessdevelopmentfr/threads

    qui est spécifique à ACCESS

    Bonne journée


    Mark Post as helpful if it provides any help.Otherwise,leave it as it is.
    jeudi 3 février 2011 22:54
  • Bonjour Guznat

    En Sql Access, utilisez Date() au lieu de Now() et à comparer avec INT(Date_Fin)

    Cdt, Blaise

    <guznat> a écrit dans le message de news: c45fef61-5e84-4de1-bb0e-18e8c800a04b@communitybridge.codeplex.com...

    Bonjour,

    J'ai une requête dans laquelle je voudrais récupérer toutes les lignes dont la date est ultérieure ou égale à celle d'aujourd'hui.

    Or cela fonctionne très bien dès demain, mais pour aujourd'hui, rien à faire...

    Voici mon code :

    select (...),Date_Fin, (...) where (...) Date_Fin>=now() order by Date_Fin asc

    Comme je le disais, ça me renvoie toutes les lignes ayant pour date le jour suivant now(), mais rien dès lors que la valeur est la même?

    Que faire, je désespère!!

    Cordialement


    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!

    • Proposé comme réponse blaise032 mercredi 9 février 2011 16:28
    vendredi 4 février 2011 16:17
  • Bonjour,

    Une solution peut être

    En mode création remplacer dans la colonne "[Date_Fin]" la condition ">=Now()" par >=SérieDate(Année(Maintenant());Mois(Maintenant());Jour(Maintenant()))

    Voici la syntaxe SQL

    SELECT Table1.Nom, Table1.[Date_Fin]
    FROM Table1
    WHERE (((Table1.[Date_Fin])>=DateSerial(Year(Now()),Month(Now()),Day(Now()))))
    ORDER BY Table1.[Date_Fin];
    
    

     


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users
    • Marqué comme réponse guznat mardi 8 février 2011 09:17
    lundi 7 février 2011 14:42
  • Bonjour,

    Merci MedhiH, le problème a été effectivement solutionné de cette façon.

    Cordialement


    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!
    mardi 8 février 2011 09:19
  • SELECT * FROM MaTable WHERE DATEPART ("yyyy"
    ,Date_Fin)>DATEPART("yyyy"
    ,now()) OR DATEPART ("yyyy",Date_Fin)= DATEPART ("yyyy"
    ,now())  AND  DATEPART ("m",Date_Fin)> DATEPART ("m"
    ,now())  OR  DATEPART ("yyyy",Date_Fin)= DATEPART ("yyyy",now())  AND  DATEPART("m",Date_Fin)=DATEPART("m",now()) AND  DATEPART("d",Date_Fin)>=DATEPART("d",now())
    

    Thomas Aimonetti - C# - Sharplog Engineering - http://www.sharplog.fr

    Merci d'avoir pris le temps de me répondre. C'est certes une solution qui fonctionne. Toutefois celle de MedhiH a l'avantage d'être plus concise.

    Cordialement


    Celui qui ne sait rien en sait autant que celui qui n'en sait pas plus!!
    mardi 8 février 2011 09:22
  • Bonjour Mehdi,

    Je ne comprends pas :
    Pourquoi ne pas utiliser Date() au lieu de Now().  Date() renvoie une date, alors que Now() renvoie la date ET l'heure.  C'est cela qui provoque le problème.
    Faire un DateSerial ne peut que ralentir la requête, il me semble.  Et parfois, dans des rapports complexes, il peut y avoir plusieurs milliers de requêtes : cela joue.

    Il faut aussi faire attention que dans Table1.[Date_Fin], cela soit bien strictement une date...

    SELECT Table1.Nom, Table1.[Date_Fin]
    FROM Table1
    WHERE Table1.[Date_Fin]> = Date()
    ORDER BY Table1.[Date_Fin];
    
    

    <MehdiH> a écrit dans le message de news: ee847b72-e59f-4695-a6ff-15c5f0fcbc89@communitybridge.codeplex.com...

    Bonjour,

    Une solution peut être

    En mode création remplacer dans la colonne "[Date_Fin]" la condition ">=Now()" par*>=SérieDate(Année(Maintenant());Mois(Maintenant());Jour(Maintenant()))*
    Voici la syntaxe SQL


    SELECT Table1.Nom, Table1.[Date_Fin] FROM Table1 WHERE (((Table1.[Date_Fin])>=DateSerial(Year(Now()),Month(Now()),Day(Now())))) ORDER BY Table1.[Date_Fin];



    En espérant avoir pu rendre service (*MehdiH*) Retrouvez moi sur *Office Users* <http://officeusers.blogspot.com>

    • Proposé comme réponse Mehdi HAMMADI mercredi 9 février 2011 07:52
    mardi 8 février 2011 17:23
  • Bonjour

    Effectivement vous avez raison, en fait au début je cherchais une fonction similaire à la fonction AUJOURDHUI() (TODAY()) d'Excel fonction qui renvois uniquement la partie entière du numéro de série de la date et en fait comme vous l'avez indiqué la fonction Access DATE() fait exactement cela. donc il suffisait de remplacer Now() par Date()

    Merci pour cette precision qui permet de rendre la requête plus rapide à l'exécution

    SELECT Table1.Nom, Table1.[Date_Fin]
    FROM Table1
    WHERE ((Table1.[Date_Fin])>=Date())
    ORDER BY Table1.[Date_Fin];


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users

    mercredi 9 février 2011 07:51
  • Dans le cas ou Date_fin contient aussi l'heure :

    SELECT Int([Date_Fin]) AS dDate
    FROM Table1
    WHERE Int([Date_Fin])>Date();

    <MehdiH> a écrit dans le message de news: 6764d2b8-de08-4231-a3d2-fc545e17e448@communitybridge.codeplex.com...

    Bonjour

    Effectivement vous avez raison, en fait au début je cherchais une fonction similaire à la fonction*AUJOURDHUI()* (TODAY()) d'Excel fonction qui renvois uniquement la partie entière du numéro de série de la date et en fait comme vous l'avez indiqué la fonction Access*DATE()* fait exactement cela. donc il suffisait de remplacer Now() par Date()

    Merci pour cette precision qui permet de rendre la requête plus rapide à l'exécution

    SELECT Table1.Nom, Table1.[Date_Fin]
    FROM Table1
    WHERE ((Table1.[Date_Fin])>=Date())
    ORDER BY Table1.[Date_Fin];



    --


    En espérant avoir pu rendre service (*MehdiH*)
    Retrouvez moi sur *Office Users* <http://officeusers.blogspot.com>

    jeudi 10 février 2011 19:52
  •  Bonjour Blaise,

    Toujours par soucis d'optimisation de la requête, il n'est pas nécessaire de faire un INT([Date_Fin]) dans ce cas précis (test avec une condition >=) car si [Date_Fin] contient les heures le champ sera alors toujours supérieur à Date() si la partie entière est la même.

    Dans le cas ou Date_fin contient aussi l'heure :

    SELECT Int([Date_Fin]) AS dDate
    FROM Table1
    WHERE Int([Date_Fin])>Date();


    En espérant avoir pu rendre service (MehdiH)
    Retrouvez moi sur Office Users
    dimanche 13 février 2011 07:50