Date comprise intervalle prédéfini ACCESS

Bonjour,

j'ai deux tables: OBSERVATION et T_ESPECE, liées par le champ ESPECE
dans OBSERVATION, 2 champs: DATE et ESPECE
dans T_ESPECE, 3 champs: ESPECE, DATE_DEBUT, DATE_FIN

j'aimerai dans une requête créer un champ où s'affiche "1" si DATE est compris entre DATE_DEBUT et DATE_FIN et "0" dans le cas contraire.

pour l'instant mes champs DATE, DATE_DEBUT et DATE_FIN sont au format jj/mm/aaaa, mais il faudrait que cette requête ne prenne pas en compte l'année.

merci de votre aide

matthias
Configuration: Windows XP
Internet Explorer 6.0

4 réponses

  1. Contributeur
    Bonjour,
    Une fonction en VBA peut-être ?
     'exemple d'appel
     'e=TestDate(Date,Date_Debut,Date_Fin)
     'Retourne 1 si compris et 0 si pas.
     '
     Function TestDate(DT As Date, DD As Date, DF As Date) As Integer
     Dim D1 As Long, D2 As Long, D3 As Long
        D1 = DateSerial(2000, Month(DT), Day(DT))
        D2 = DateSerial(2000, Month(DD), Day(DD))
        D3 = DateSerial(2000, Month(DF), Day(DF))
        If D1 >= D2 And D1 <= D3 Then
            TestDate = 1
        End If
     End Function

    NB: ne tient pas compte de l'année, mais ça me semble bizard, si entre décembre et janvier ?
    Renvoi 0
    A+
    1
    1. Slt,

      "j'aimerai dans une requête créer un champ où s'affiche "1" si DATE est compris entre DATE_DEBUT et DATE_FIN et "0" dans le cas contraire. "

      -->

      SELECT "1"
      FROM OBSERVATION, T_ESPECE
      WHERE OBSERVATION.ESPECE = T_ESPECE.ESPECE
      AND OBSERVATION.DATE >= T_ESPECE.DATE_DEBUT
      AND OBSERVATION.DATE <= T_ESPECE.DATE_FIN

      UNION

      SELECT "0"
      FROM OBSERVATION, T_ESPECE
      WHERE OBSERVATION.ESPECE = T_ESPECE.ESPECE
      AND OBSERVATION.DATE < T_ESPECE.DATE_DEBUT
      OR OBSERVATION.DATE > T_ESPECE.DATE_FIN

      "pour l'instant mes champs DATE, DATE_DEBUT et DATE_FIN sont au format jj/mm/aaaa, mais il faudrait que cette requête ne prenne pas en compte l'année."

      -->

      Là je vois pas autrement que détruire tes colonnes au format DATE pour les deux tables, créer ensuite une première colonne qui stocke l'année et stocker le doublon "JJ/MM" dans une seconde colonne sous une autre forme pour comparer car ce sera plus au format DATE.

      Donc - Pour les deux tables :

      - Créer une colonne NBJOURS qui stocke "JJ/MM" sous la forme d'un INTEGER stockant le nombre de jour depuis le début de l'année (exemple : 02/03 --> tu pré-calcule le nombre de jours entre le 01/01 et le 02/03et tu stocke ce résultat dans cette nouvelle colonne - ne pas oublier de tenir compte des années bisextiles !!).
      - Stocker l'année sous un format INTEGER dans une colonne supplémentaire : colonne ANNEE - qui servira pas ici si je t'ai compris.

      Ensuite tu t'inspires de la requête plus haut et tu compares OBSERVATION.NBJOURS et T_ESPECE.NBJOURS.

      SELECT "1"
      FROM OBSERVATION, T_ESPECE
      WHERE OBSERVATION.ESPECE = T_ESPECE.ESPECE
      AND OBSERVATION.NBJOURS >= T_ESPECE.NBJOURS
      AND OBSERVATION.NBJOURS <= T_ESPECE.NBJOURS

      UNION

      SELECT "0"
      FROM OBSERVATION, T_ESPECE
      WHERE OBSERVATION.ESPECE = T_ESPECE.ESPECE
      AND OBSERVATION.DATE < T_ESPECE.NBJOURS
      OR OBSERVATION.DATE > T_ESPECE.NBJOURS

      J'vois po autrement.

      Tu me tiens au courant ?.

      Titou.
      0
      1. Re,

        J'avais oublié : redefinir aussi les Primary Keys pour la table OBSERVATION :

        - PK1 : ANNEE.
        - PK2 : NBJOURS.

        A+.

        Titou.
        0
        1. Re,

          J'ai commis des erreurs et imprécisions.

          Voici ma solution avec les corrections.

          Pour la table OBSERVATION :

          - Créer une colonne NBJOURS qui stocke "JJ/MM" sous la forme d'un INTEGER stockant le nombre de jours depuis le début de l'année (exemple : 02/03 --> tu pré-calcules le nombre de jours entre le 01/01 et le 02/03 et tu stockes ce résultat dans cette nouvelle colonne - ne pas oublier de tenir compte des années bissextiles !!).
          - Stocker l'année sous un format INTEGER dans une colonne supplémentaire : colonne ANNEE - qui servira pas ici si je t'ai compris.
          - Alimentation des colonnes ANNEE et NBJOURS à partir de l'ancienne colonne DATE via une moulinette.
          - Enlever l'attribut PK sur la colonne DATE.
          - Destruction de la colonne DATE.
          - Définition des nouvelles PK1 et PK2 sur ANNE et NBJOURS.

          Pour la table T_ESPECE - par analogie avec la table précédente :

          - Créer une colonne NBJOURS_DEBUT (INTEGER) stockant le nombre de jours depuis le début de l'année.
          - Créer une colonne ANNEE_DEBUT (INTEGER) stockant l'année.
          - Créer une colonne NBJOURS_FIN (INTEGER) stockant le nombre de jours depuis le début de l'année.
          - Créer une colonne ANNEE_FIN (INTEGER) stockant l'année.
          - Alimentation des colonnes ANNEE_DEBUT et NBJOURS_DEBUT à partir de l'ancienne colonne DATE_DEBUT via une moulinette.
          - Alimentation des colonnes ANNEE_FIN et NBJOURS_FIN à partir de l'ancienne colonne DATE_FIN via une moulinette.
          - Destruction des colonnes DATE_DEBUT et DATE_FIN.

          -->

          SELECT "1"
          FROM OBSERVATION, T_ESPECE
          WHERE OBSERVATION.ESPECE = T_ESPECE.ESPECE
          AND OBSERVATION.NBJOURS >= T_ESPECE.NBJOURS_DEBUT
          AND OBSERVATION.NBJOURS <= T_ESPECE.NBJOURS_FIN

          UNION

          SELECT "0"
          FROM OBSERVATION, T_ESPECE
          WHERE OBSERVATION.ESPECE = T_ESPECE.ESPECE
          AND OBSERVATION.NBJOURS < T_ESPECE.NBJOURS_DEBUT
          OR OBSERVATION.NBJOURS > T_ESPECE.NBJOURS_FIN

          Là je pense qu'il n'y a plus d'erreurs - à tester.

          Titou.
          0