|
encore de l'algorithme de fou.... |
Débuté par agidrol, 27 fév. 2006 17:48 - 14 réponses |
| |
| | | |
|
| |
Posté le 27 février 2006 - 17:48 |
bonjour à tous,
petit programme à se casser la tête dessus.
J'ai dans une base de donnée, des personnes avec date de naissance. je dois à un moment de l'année, retrouver toutes les personnes nées entre 2 dates, mais sans les années.
par exemple, je voudrais les personnes nées entre le 12 décembre (12/12) et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout (14/08)
J'ai beau chercher, j'arrive à rien......... surtout quand mes date sont inversées. 12 décembre (12/12) et le 15 fevrier
J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros lors de leur anniversaire.
Merci de votre aide.
Antoine GIDROL |
| |
| |
| | | |
|
| | |
| |
Posté le 27 février 2006 - 18:49 |
Bonjour,
tu peut faire cela :
SELECT RIGHT(date_naissance,4) from enfants where RIGHT(date_naissance,4) between '0901' and '0931'
en gros, tu selectionne le jour et le mois de naissance de toutes les personnes de ta base et ensuite tu met une condition de selection sur la période que tu as besoins
ici je selectionne tous les "enfants" qui on une date de naissance entre le 01 septembre et le 31.
bon dev
jeanlin |
| |
| |
| | | |
|
| | |
| |
Posté le 27 février 2006 - 18:49 |
Antoine GIDROL a utilisé son clavier pour écrire :
bonjour à tous,
petit programme à se casser la tête dessus.
J'ai dans une base de donnée, des personnes avec date de naissance. je dois à un moment de l'année, retrouver toutes les personnes nées entre 2 dates, mais sans les années.
par exemple, je voudrais les personnes nées entre le 12 décembre (12/12) et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout (14/08)
J'ai beau chercher, j'arrive à rien......... surtout quand mes date sont inversées. 12 décembre (12/12) et le 15 fevrier
J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros lors de leur anniversaire.
Merci de votre aide.
Antoine GIDROL
Tu as tout ce que tu demandes dans l'aide ( F1, Rechercher Date, Type Date)
-- Eric Laurent nospam.laurent.systel@wanadoo.fr (enlever nospam.) |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 07:00 |
Bonjour
"Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news: 44031e09$1@news.pcsoft.fr...
bonjour à tous,
petit programme à se casser la tête dessus.
J'ai dans une base de donnée, des personnes avec date de naissance. je dois à un moment de l'année, retrouver toutes les personnes nées entre 2 dates, mais sans les années.
par exemple, je voudrais les personnes nées entre le 12 décembre (12/12) et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout (14/08)
J'ai beau chercher, j'arrive à rien......... surtout quand mes date sont inversées. 12 décembre (12/12) et le 15 fevrier
J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros lors de leur anniversaire.
Merci de votre aide.
Antoine GIDROL
Tu devrais arriver à faire cela en 5 ou 10 lignes de code Wlangage.
D'abord, tu fixes la période que tu veux explorer (du 12/04 au 26/08 par exemple). Tu as donc: - un jour mini: le 12/04 - un jour maxi: le 26/08
Tu définis ensuite une date à partir du jour mini et du jour maxi, en te basant sur l'année en cours. Tu as donc - une date mini: le 12/04/2006 - une date maxi: le 26/08/2006
Ensuite, et bien il y a plein de solutions. Par exemple: 1) tu lis la date de naissance des personnes dans le fichier HF (exemple "19881225" pour le 25/12/1988") 2) après lecture, tu crées une variable qui sera égale à la date de naissance lue dans le fichier HF 3) tu remplaces, dans la variable créée précédemment, l'année de naissance par l'année en cours (dans l'exemple précisé en 1, tu remplaces "1988" par "2006" et tu obtiens le 25/12/2006") 4) pour terminer, tu vérifies si la date ainsi obtenue (25/12/2006) est comprise entre les dates mini (12/04/2006) et maxi (26/08/2006)
Et voilà. Ce qu'il faut, bien sur, c'est prendre également en compte la spécificité du 29/02. Donc, dans le traitement, il faut que tu testes la validité de la date via DateValide.
A+
Val |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 07:00 |
Cela veux dire que je dois travailler sur chaque mois entre mon intervalle de date ? C'est une solution, mais il n'y aurai pas plus rapide ?
Eric laurent : je suis pas certain que ce que je cherche est dans l'aide, je ne cherche pas de date à date, puisque je ne m'occupe pas des année. Mais si tu as la solution, je suis prenneur.
exemple :
dernier lancement du programme : 15/12/2005 Lancement ce jour : 27/02/2006
je veux retrouver dans ma base de donnée toutes les personnes nées entre le 15/12 et le 27/02 mais pas pour l'année 2005 et 2006 mais pour toutes les années. par exemple, je voudrai retrouver PAUL dont la date de naissance est 26/12/1970 puisque 26/12 est bien compris entre le 15/12 et le 27/02
Par avance merci
Antoine
"jeanlin" <guest@newsgroup.fr> a écrit dans le message de news: 44032aec$1@news.pcsoft.fr...
Bonjour,
tu peut faire cela :
SELECT RIGHT(date_naissance,4) from enfants where RIGHT(date_naissance,4) between '0901' and '0931'
en gros, tu selectionne le jour et le mois de naissance de toutes les personnes de ta base et ensuite tu met une condition de selection sur la période que tu as besoins
ici je selectionne tous les "enfants" qui on une date de naissance entre le 01 septembre et le 31.
bon dev
jeanlin
|
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 09:21 |
Bonjour,
Il suffit de créer une requete, tu as un bouton Année,Département Sélectionne mois Formule : Right( champDate, 4)
Ensuite, sur ce champs, il faut 2 paramètres 1 - Mois >= Parametre1 2 - Mois <= Parametre2
Sur ta requete, Requete.Param1 = DateDebut[[5 A 8]] ou right( DateDebut,4) Requete.Param2 = DateFin[[5 A 8]] ou right( DateFin,4) hExecuteRequete( taRequete, ....)
Cordialement,
C.AUBRY |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 09:23 |
bonjour à tous,
petit programme à se casser la tête dessus.
J'ai dans une base de donnée, des personnes avec date de naissance. je dois à un moment de l'année, retrouver toutes les personnes nées entre 2 dates, mais sans les années.
par exemple, je voudrais les personnes nées entre le 12 décembre (12/12) et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout (14/08)
Pour ce genre de traitement, c'eut été plus simple de disposer dans la base de données de la date sous forme d'entier. Si tu as moyen de rajouter cette colonne (et de l'alimenter avec une petite moulinette).
C'est bcp plus facile pour les intervalles.
Gilles. |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 09:23 |
Bonjour VAl,
j'ai pensé aussi faire cette solution, mais cela ne fonctionne pas si j'ai des tranches de date sur 2 années.(2005 et 2006) qui se chevauche
- une date mini: le 12/12/2005 - une date maxi: le 26/04/2006
si j'ai 25/12/1988 et 02/04/1998 je vais donc avoir
25/12/2006 que je ne vais pas prendre dans ta solution ? erreur et si je mets 2005 à la place, ok pour 25/12/2005, mais erreur pour 02/04/2005 .....
Mais il faut peut etre ppour que cela fonctionne que je rajoute une condition : si < devembre alors année avant, sinon, anné apres ?
je vais chercher encore si il n'y a pas une autre solution.
Merci
Antoine
"Val" <Valsofts@free.fr> a écrit dans le message de news: 44033758@news.pcsoft.fr...
Bonjour "Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news: 44031e09$1@news.pcsoft.fr... bonjour à tous,
petit programme à se casser la tête dessus.
J'ai dans une base de donnée, des personnes avec date de naissance. je dois à un moment de l'année, retrouver toutes les personnes nées entre 2 dates, mais sans les années.
par exemple, je voudrais les personnes nées entre le 12 décembre (12/12) et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout (14/08)
J'ai beau chercher, j'arrive à rien......... surtout quand mes date sont inversées. 12 décembre (12/12) et le 15 fevrier
J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros lors de leur anniversaire.
Merci de votre aide.
Antoine GIDROL
Tu devrais arriver à faire cela en 5 ou 10 lignes de code Wlangage. D'abord, tu fixes la période que tu veux explorer (du 12/04 au 26/08 par exemple). Tu as donc: - un jour mini: le 12/04 - un jour maxi: le 26/08 Tu définis ensuite une date à partir du jour mini et du jour maxi, en te basant sur l'année en cours. Tu as donc - une date mini: le 12/04/2006 - une date maxi: le 26/08/2006 Ensuite, et bien il y a plein de solutions. Par exemple: 1) tu lis la date de naissance des personnes dans le fichier HF (exemple "19881225" pour le 25/12/1988") 2) après lecture, tu crées une variable qui sera égale à la date de naissance lue dans le fichier HF 3) tu remplaces, dans la variable créée précédemment, l'année de naissance par l'année en cours (dans l'exemple précisé en 1, tu remplaces "1988" par "2006" et tu obtiens le 25/12/2006") 4) pour terminer, tu vérifies si la date ainsi obtenue (25/12/2006) est comprise entre les dates mini (12/04/2006) et maxi (26/08/2006) Et voilà. Ce qu'il faut, bien sur, c'est prendre également en compte la spécificité du 29/02. Donc, dans le traitement, il faut que tu testes la validité de la date via DateValide. A+ Val |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 10:21 |
Bonjour
"Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news: 44031e09$1@news.pcsoft.fr...
par exemple, je voudrais les personnes nées entre le 12 décembre (12/12) et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout (14/08)
Clairement, tu ne peux pas travailler avec la date ou une partie de la date, à cause des chevauchements d'années.
J'utiliserai la fonction DateVersEntier avec le paramètre DepuisDébutAnnée à Vrai. Cela te donne un nombre de jour depuis le début de l'année. Tu peux donc convertir toutes les dates dont tu te sers en un numéro indépendant de l'année. Après c'est une affaire de tests, pas bien compliquée...
Jean-Louis MOREL |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 10:24 |
A mon avis le plus simple est quand meme d inclure l année :
tu cherches bien sur une tranche d année quand meme ?? Sinon ce n est pas grave, il fo juste fixer une année de début, on la nommera AA1!
Dans ce cas tu peux faire une boucle qui parcours les années : Par exemple tu veux les personnes entre J1/M1 et J2/M2. Pour gerer l ordre des dates (si elles sont inversées), on utilise AA2 :
Si "J1/M1/"+AA1>"J2/M2/"+AA1 alors AA2ª1+1 Sinon AA2ª1 Fin
Ensuite tu fais ta boucle, soit en lancant plusieurs select, soit en construisant le code de la requete (et donc un seul hexecuterequetesql !). Dans l'exemple on fait ca sur 10 ans ....
i est entier NbAnnée est entier sSql est chaine sSql="Select * From Personnes Where " For i=1 to NbAnnée sSql+="Date Between J1/M1/" + AA1 + " AND J2/M2/" + AA2 IF i<NbAnnée then sSql+=" AND " AA1++ AA2++ END
Il ne reste plus qu a lancer la requete avec le texte sSql ...
Voila ca devrait te donner des idées (c est du pseudo langage, a adapter avec les formats de date !!!!) J espere que ca t aidera, Damien. |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 11:01 |
Merci à tous pour votre aide, je vais utiliser la solution de jean louis, avec quelques "si" imbriqué pour gerer le reste.
merci beaucoup
Antoine GIDROL
"Jean-Louis MOREL" <vsi.jlm@free.fr> a écrit dans le message de news: 4404031b$1@news.pcsoft.fr...
Bonjour "Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news: 44031e09$1@news.pcsoft.fr... par exemple, je voudrais les personnes nées entre le 12 décembre (12/12) et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout (14/08)
Clairement, tu ne peux pas travailler avec la date ou une partie de la date, à cause des chevauchements d'années. J'utiliserai la fonction DateVersEntier avec le paramètre DepuisDébutAnnée à Vrai. Cela te donne un nombre de jour depuis le début de l'année. Tu peux donc convertir toutes les dates dont tu te sers en un numéro indépendant de l'année. Après c'est une affaire de tests, pas bien compliquée... Jean-Louis MOREL |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 11:01 |
Mince une grosse bourde dans le code :
Ce n est pas AND mais OR bien sur qu il fallait utiliser !
Dam's. |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 11:06 |
Re
"Antoine GIDROL" <agidrol@free.fr> a écrit dans le message de news: 440409c6$1@news.pcsoft.fr...
Merci à tous pour votre aide, je vais utiliser la solution de jean louis, avec quelques "si" imbriqué pour gerer le reste.
testé, ça marche. Il ne reste qu'à formater les date D1 et D2 en fonction de tes paramètres :
d1 est une Date="20051212" d2 est une Date="20060123" dtest est une Date //la date à tester
j1 est un entier=DateVersEntier(d1,Vrai) j2 est un entier=DateVersEntier(d2,Vrai) jt est un entier=DateVersEntier(dtest,Vrai)
SI j1>j2 ALORS SI jt>=j1 OU jt <=j2 ALORS Info("ok") SINON Info("out") FIN SINON SI jt>=j1 ET jt <=j2 ALORS Info("ok") SINON Info("out") FIN FIN
Jean-Louis MOREL |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 15:28 |
Ton algo est plutôt ingénieux mais pose un problème sur les années bissextiles, en effet, si tu demandes par Ex du 12/12 au 31/01, une personne née le 11/12/1948 sera acceptée par ton algorithme. A moins de tester toutes les années bissextiles, l'utilisation du parametre DepuisDebutAnnée donnera toujours un décalage sur des dates limites. Je propose un autre algo qui ne posera pas ce problème :
d1 est une chaîne="1212" //du 12 decembre n d2 est une chaîne="0215" //au 15 Février n+1 nD1 est un entier nD2 est un entier nDateNais est un entier DateNais est une Date="19481211" //exemple date de naissance 11/12/1948 Nbj est un entier Dif est un entier
nD1=Val(d1) nD2=Val(d2) SI nD1 > nD2 ALORS nD2+000 //cas particulier de bornes sur 2 années Nbj = nD2-nD1 //Intervalle en nbre de jours entre nD1 et nD2
//Pour toute DATENAIS nDateNais=Val(Milieu(DateNais,5)) SI nDateNais<nD1 ALORS nDateNais+000 //cas particulier de bornes sur 2 années
Dif=nDateNais-nD1 //Intervalle entre DateNais et Borne 1
SI Dif<=Nbj ALORS Info("Ok") SINON Info("pas OK") FIN //FIN
Bon Dev. |
| |
| |
| | | |
|
| | |
| |
Posté le 28 février 2006 - 17:25 |
Antoine GIDROL a écrit :
bonjour à tous,
petit programme à se casser la tête dessus.
J'ai dans une base de donnée, des personnes avec date de naissance. je dois à un moment de l'année, retrouver toutes les personnes nées entre 2 dates, mais sans les années.
par exemple, je voudrais les personnes nées entre le 12 décembre (12/12) et le 15 fevrier (15/02) ou alors entre le 02 mars (02/03) et le 14 aout (14/08)
J'ai beau chercher, j'arrive à rien......... surtout quand mes date sont inversées. 12 décembre (12/12) et le 15 fevrier
J'ai besoin de ceci afin d'ajouter à une carte de fidélité, des euros lors de leur anniversaire.
Merci de votre aide.
Antoine GIDROL
en gros tu teste si ton moi est dans l'ordre ou pas
SI val(MoisDébut)>val(MoisFin) ALORS // Requete sql ... Where DateN>=DateDébut OU DateN<=DateFin ... SINON // Requete sql ... Where DateN>=DateDébut ET DateN<=DateFin ... FIN
après ta requête devrait se passer sans problèmes. DateN est la date de naissance du fichier dans l'année au format MMJJ MoisDébut est juste le mois de début de période MoisFin est juste le mois de fin de période
si en plus tu risque de rencontré une sélection sur le même mois en inversé il faudra prendre en compte le jours aussi. 20/02 et 10/02 par exemple (val de 0220 est superieur a val de 0210)
a++ Goof |
| |
| |
| | | |
|
| | | | |
| | |
|