Date comprise intervalle prédéfini ACCESS

matthias.laprun Messages postés 1 Date d'inscription   Statut Membre -  
 titou -
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. lermite222 Messages postés 9042 Statut Contributeur 1 199
     
    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
  2. titou
     
    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
  3. titou
     
    Re,

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

    - PK1 : ANNEE.
    - PK2 : NBJOURS.

    A+.

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