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

VBA Access Discussion :

comparaison de dates quelque soit l'année


Sujet :

VBA Access

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut comparaison de dates quelque soit l'année
    Bonjour.

    Je suis conscient que ma question a un petit, voire un gros goût de déjà vu.

    En effet, il s'agit d'une question sur les dates…

    Voici la façon simple que j'ai imaginé pour expliquer mon problème.

    Imaginons une réserve de chasse spéciale, pour laquelle il existe une période de l'année où la chasse est interdite.
    Pour simplifier, on va dire entre le premier juillet et le 15 août.
    Cette période interdite est immuable ne sera pas modifiée ni l'année suivante, ni le siècle suivant.

    Imaginons que les chasseurs doivent déposer une demande d'autorisation pour pouvoir chasser le reste de l'année et que cette demande doivent comporter les dates auxquelles ils souhaitent commencer et terminer à chasser.

    Il va de soit que ni la date de début de chasse, ni la date de fin ne doivent être incluses dans la période interdite.

    Quand je saisi les demandes dans ma base, je saisi la date de début et la date de fin.

    Le problème : j'aimerais que la base m'indique que l'une ou l'autre des dates se trouve dans la période interdite.

    Après avoir fait un tour sur la FAQ, voici les solutions que j'ai écarté :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me!Date_Début > DateSerial(Year(DT_STRT), 7, 1)
    Ici, j'indique à l'application que le champ qui contient la date de début d'autorisation est supérieur au 1 er juillet de la même année que l'année de la date de début d'autorisation
    Exemple :
    La date de début du 01 juin 2009 est comparée au 1er juillet 2009.
    Mais l'année suivante, cette date ne posera plus de problème car on sera en 2010.
    La vérification se fera toujours, la base verra que la date de début est bien supérieure, mais malheureusement, rien ne la vérifiera par rapport à 2010.

    J'ai aussi essayé en prenant l'année en cours, comme année de référence, mais si la demande est déposée l'année précédente, la détection ne se fait pas.

    Ma question :
    Comment faire en sorte de ne prendre que le jour et le mois d'une date et de le comparer au jour et le moi d'une autre date, et ce quelque soient les années.

    D'avance merci.

  2. #2
    Rédacteur/Modérateur

    Avatar de Jean-Philippe André
    Homme Profil pro
    Développeur VBA/C#/VB.Net/Power Platform
    Inscrit en
    Juillet 2007
    Messages
    14 598
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : Canada

    Informations professionnelles :
    Activité : Développeur VBA/C#/VB.Net/Power Platform
    Secteur : Finance

    Informations forums :
    Inscription : Juillet 2007
    Messages : 14 598
    Points : 34 286
    Points
    34 286
    Par défaut
    salut,
    tu as pris la bonne piste de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me!Date_Début > DateSerial(Year(DT_STRT), 7, 1)
    maintenant, les questions que "nous" allons te poser pour que tu continuer à avancer :
    - comment connais-tu l'année de la demande de chasser ?
    - comment en déduis-tu les dates de début et de fin d'autorisation sur l'année en question ?
    - comment testes-tu le chevauchement éventuel des dates posées par rapport à celles légales ?
    Cycle de vie d'un bon programme :
    1/ ça fonctionne 2/ ça s'optimise 3/ ça se refactorise

    Pas de question technique par MP, je ne réponds pas

    Mes ouvrages :
    Apprendre à programmer avec Access 2016, Access 2019 et 2021

    Apprendre à programmer avec VBA Excel
    Prise en main de Dynamics 365 Business Central

    Pensez à consulter la FAQ Excel et la FAQ Access

    Derniers tutos
    Excel et les paramètres régionaux
    Les fichiers Excel binaires : xlsb,

    Autres tutos

  3. #3
    Membre chevronné
    Inscrit en
    Août 2006
    Messages
    1 588
    Détails du profil
    Informations forums :
    Inscription : Août 2006
    Messages : 1 588
    Points : 2 178
    Points
    2 178
    Par défaut
    peut-être ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (cdate(me!Date_début)< dateserial(year(me!Date_début),7,1)) And cdate(me!Date_début)> (dateserial(year(me!Date_début),8,15))

  4. #4
    Expert confirmé Avatar de nico84
    Homme Profil pro
    Consultant/développeur ERP
    Inscrit en
    Mai 2008
    Messages
    3 090
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Consultant/développeur ERP
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 3 090
    Points : 5 207
    Points
    5 207
    Par défaut
    Bonsoir,

    Un moyen simple de comparer des (parties de) dates consiste à les convertir en chaines de caractère. Pour que l'ordre soit "logique" (ordre alphabétique=ordre calendaire) il faut les inverser : année puis mois puis jour et si besoin heure, minute... (dans ton cas mois puis jour seulement).

    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if format(date_saisie,"mmdd")=format(date_naissance,"mmdd") then msgbox "Bon anniversaire !!!"
    if format(date_saisie,"mmdd")>format(date_naissance,"mmdd") then msgbox "C'est passé cette année :("
    if format(date_saisie,"mmdd")>"0321" and format(date_saisie,"mmdd")<="0621" then msgbox "C'est le printemps :)"
    if format(now,"hhmm")>"1630" and format(now,"hhmm")<="1700" then msgbox "Tea time !"
    Les fonctions year, month, day... sont probablement plus rapides donc à privilégier dans les cas simples
    Utilisez Planet, gestion d'entreprise gratuite pour TPE / PME

  5. #5
    Membre régulier
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    188
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 188
    Points : 98
    Points
    98
    Par défaut
    Bonjour à tous.
    Dans l'ordre :
    Citation Envoyé par jpcheck Voir le message
    salut,
    tu as pris la bonne piste de départ
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Me!Date_Début > DateSerial(Year(DT_STRT), 7, 1)
    maintenant, les questions que "nous" allons te poser pour que tu continuer à avancer :
    - comment connais-tu l'année de la demande de chasser ?
    L'année de la demande de chasser est incluse dans le champ Date_Début (exemple :un chasseur veut pouvoir commencer à chasser le 15 juin 2009)
    Citation Envoyé par jpcheck Voir le message
    - comment en déduis-tu les dates de début et de fin d'autorisation sur l'année en question ?
    Au même titre que le chasseur indique la date à laquelle il souhaite commencer à chasser, il indique la date à laquelle il souhaite arrêter de chasser (exemple : Date_Fin)
    Citation Envoyé par jpcheck Voir le message
    - comment testes-tu le chevauchement éventuel des dates posées par rapport à celles légales
    Je vérifie que ni la date de début, ni la date de fin ne soient supérieures à la date de début de la période d'interdiction et inférieures à la date de fin de la période d'interdiction, un peut comme proposé par helas et cité ci-dessous :
    Citation Envoyé par helas Voir le message
    peut-être ceci
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    (cdate(me!Date_début)< dateserial(year(me!Date_début),7,1)) And cdate(me!Date_début)> (dateserial(year(me!Date_début),8,15))
    Quelle est la fonction de cdate ? j'arrive à faire la comparaison ci-dessus sans utiliser cdate, juste en indiquant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     Me!Date_début < dateserial(year(me!Date_début),7,1)) And Me!Date_début > (dateserial(year(me!Date_début),8,15))
    De plus, ce code possède une tare : les dates de demande, par exemple la date de début, ne sont comparées qu'avec l'année de la date de demande.
    Exemple :
    Si un chasseur indique une date de début au 15 juillet 2009, l'application va tilter en repérant que cette date est post 1er juillet de l'année de la demande, soit post 1er juillet 2009.
    Si pour quelque raison que ce soit, cette même demande est retraitée en 2010, la vérification sera bancale.
    Bien sur que la condition sera de nouveau vérifiée, la demande pour le 15 juillet 2009 sera toujours au de la du premier juillet de l'année de la demande soit le 1er juillet 2009…
    Mais il me semble que la bonne façon de procéder serait que l'application surveille que la date ne soit pas comprise entre les 1er juillet et le 15 septembre, quelque soit l'année.
    Citation Envoyé par nico84 Voir le message
    Bonsoir,
    Un moyen simple de comparer des (parties de) dates consiste à les convertir en chaines de caractère. Pour que l'ordre soit "logique" (ordre alphabétique=ordre calendaire) il faut les inverser : année puis mois puis jour et si besoin heure, minute... (dans ton cas mois puis jour seulement).
    Exemples :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if format(date_saisie,"mmdd")=format(date_naissance,"mmdd") then msgbox "Bon anniversaire !!!"
    if format(date_saisie,"mmdd")>format(date_naissance,"mmdd") then msgbox "C'est passé cette année :("
    if format(date_saisie,"mmdd")>"0321" and format(date_saisie,"mmdd")<="0621" then msgbox "C'est le printemps :)"
    if format(now,"hhmm")>"1630" and format(now,"hhmm")<="1700" then msgbox "Tea time !"
    Les fonctions year, month, day... sont probablement plus rapides donc à privilégier dans les cas simples
    Pas mal cette idée qui m'apparaît comme la bonne solution. Je vais essayer de ce pas…
    Y a t il des risques ou des limites qui font que l'on voit plus souvent les Year etc… ?
    Encore merci à tous.

Discussions similaires

  1. problème de comparaison de date (si de différentes années)
    Par jamesleouf dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 23/05/2008, 11h20
  2. comparaison de date
    Par nickoshiba dans le forum PostgreSQL
    Réponses: 3
    Dernier message: 15/03/2005, 15h48
  3. Probleme de date avec changement d'année
    Par GrisburT dans le forum Oracle
    Réponses: 11
    Dernier message: 30/11/2004, 16h15
  4. Comparaison de dates
    Par Tapioca dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 16/06/2004, 15h55
  5. Problème de comparaison de dates
    Par MiJack dans le forum Langage SQL
    Réponses: 2
    Dernier message: 12/03/2004, 21h43

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