Date comprise intervalle prédéfini ACCESS

matthias.laprun Messages postés 1 Date d'inscription   Statut Membre Dernière intervention   -  
 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

4 réponses

lermite222 Messages postés 9042 Statut Contributeur 1 191
 
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
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
titou
 
Re,

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

- PK1 : ANNEE.
- PK2 : NBJOURS.

A+.

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