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. 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
    1. Re,

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

      - PK1 : ANNEE.
      - PK2 : NBJOURS.

      A+.

      Titou.
      0
      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. 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