Requête mysql compliqué

gosu14 Messages postés 13 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 12 octobre 2008 - 2 juil. 2008 à 17:22
gosu14 Messages postés 13 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 12 octobre 2008 - 5 juil. 2008 à 01:04
Bonjour,
Je suis un novice en php/mysql et je suis devant un léger problème. J'ai une base SMIC qui ressemble a cela :

id    taux       DateDebut          DateFin
1     8.27      2006-07-01       2007-06-30
2     8.44      2007-07-01       2008-04-30
3     8.63      2008-05-01       2009-07-31

Voila j'aimerais récupérer le taux pour une année, je m'explique : la fonction qui utilisera cette requête aura l'année en paramètre donc par exemple si l'année est 2008, il y un changement de taux, donc j'aimerai récupérer les 2 taux différents.

En gros il faut faire une requête qui test si il y a un changement dans l'année, puis qui renvoi ensuite le ou les taux . A quoi ressemble cette requête ?
Merci pour vos réponses.

7 réponses

PlayerMania Messages postés 95 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 avril 2009
2 juil. 2008 à 23:27
Bin avec qqch du style qui te récupère tous les taux selon ton année
SELECT taux FROM matable WHERE annee = 2007;
$mes_taux = mysql_fetch_array();

Ensuite tu boucle sur ton tableau $mes_taux pour tous les rechopper, éventuellement en sortir une moyenne ou ce que tu veux
$i=0;
$size=count($mes_taux);
while($i < $size)
    {
    echo $mes_taux[$i];
    $i++;
    }

Faire cela juste avec une seul requete est surement bien sure possible, mais je doute que les performance soit terrible....
0
neigedhiver Messages postés 2480 Date d'inscription jeudi 30 novembre 2006 Statut Membre Dernière intervention 14 janvier 2011 19
3 juil. 2008 à 19:01
Salut,

@Playermania : gosu a pris soin de préciser à quoi ressemble sa table, la requête que tu proposes n'est donc pas franchement adaptée, puisque tu utilises un champ (annee) qu'il n'a pas...

SELECT taux FROM table_smic WHERE DateDebut LIKE '2008%' OR DateFin LIKE '2008%';

Après, un traitement normal du résultat avec mysql_fetch_*****()

<hr size="2" width="100%" />Neige

N'hésitez pas à lire la doc de PHP avant de poser des questions triviales...
0
JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 2
3 juil. 2008 à 22:11
Hello,

Tu peux aussi utiliser les fonctions DATE
Par exemple : SELECT id, taux, DateDebut, DateFin FROM ta_table WHERE YEAR(DateDebut) 2008 OR YEAR (DateFin) 2008
Tu récuperrera tous les enregistrements de l'année 2008
<hr />Si ma reponse te convient, merci de l'accepter ! 
0
PlayerMania Messages postés 95 Date d'inscription jeudi 22 avril 2004 Statut Membre Dernière intervention 28 avril 2009
4 juil. 2008 à 09:27
@neigedhiver, j'ai prend soin expret d'essayer de ne pas donner une réponse toute cru, c'est la moindre des choses que l'intéréssé y mette un peu de sa réflexion.

JoJo738 nous sort la plus belle requete aussi, en espérant qu'il n'y ai pas plus de 2-3 taux par an.
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 2
4 juil. 2008 à 21:49
(Arf, erreur avec la TextBox :s Retour en textarea ^^)

Par contre, je ne sais pas, mais la meilleur solution serait peut-être de trouver les années correspondants aux intervalles ... Car si on saute un an (imaginons), il n'y a aucun résultats pour 2008 ...

Je verrais peut être un TO_DATE() ?? ou une autre fonction SQL ... je vais aller voir sur la doc :s
0
JoJo738 Messages postés 1267 Date d'inscription mercredi 7 juillet 2004 Statut Membre Dernière intervention 29 juin 2010 2
5 juil. 2008 à 00:11
Ahhh !

En cherchant un peu ... j'ai réussi à faire ça :

SELECT
id,
taux,
DateDebut,
DateFin
FROM
ta_table
WHERE
TO_DAYS( STR_TO_DATE( '2008-01-01', '%Y-%d-%m' ) ) - TO_DAYS( DateDebut )
BETWEEN
- DAYOFYEAR(STR_TO_DATE( '2008-31-12', '%Y-%d-%m' ) )
AND
DATEDIFF( DateFin, DateDebut )


Etudions la requête ...

- STR_TO_DATE( '2008-01-01', '%Y-%m-%d' )
-> Converti la date 2008-01-01 (Y-m-d) en date DATETIME (AAAA-MM-JJ). Ce qui correspond au 1er jour de l'année 2008 (ou année recherchée)

- TO_DAYS
-> convertie la date en jours (nombre de jours depuis l'année 0)

- "- DAYOFYEAR(STR_TO_DATE( '2008-31-12', '%Y-%d-%m' ) )" correspond au nombre de jours dans l'année recherchée
- "DATEDIFF( DateFin, DateDebut )" c'est la différence (en jours) entre les deux dates (toujours positif)
- "TO_DAYS( STR_TO_DATE( '2008-01-01', '%Y-%d-%m' ) ) - TO_DAYS( DateDebut )" est la différence entre les dates du 1er de l'année recherchée et la DateDebut

Bref, on cherche toutes la valeurs ou cette dernière différence soit comprise entre moins le nombre de jour dans l'année (365 OU 366) et la différence des deux dates.
ce qui nous permet de récupérer les valeurs ou l'année recherchée est comprise entre les deux dates (possibilité de faire des saut d'années (2007 -> 2009 -> 2020 [etc ...])


Et sinon, tu peux faire ça (plus simple pour la gestion je trouve) :

SET @annee = '2008'; SELECT
id,
taux,
DateDebut,
DateFin,
@annee as annee
FROM
test_date
WHERE
TO_DAYS( STR_TO_DATE( CONCAT(@annee, '-01-01'), '%Y-%d-%m' ) ) - TO_DAYS( DateDebut )
BETWEEN
- DAYOFYEAR(STR_TO_DATE( CONCAT(@annee, '-31-12'), '%Y-%d-%m' ) )
AND
DATEDIFF( DateFin, DateDebut )

( tout dans le même mysql_query() ;) )


Note (post précédent) : TO_DATE() pour Oracle, et STR_TO_DATE() est son homologue en MySQL
0
gosu14 Messages postés 13 Date d'inscription mercredi 10 octobre 2007 Statut Membre Dernière intervention 12 octobre 2008 1
5 juil. 2008 à 01:04
Merci, pour cet échange c'est très constructif je pense que la réponse final ressemble le plus à ce que je veux faire, je vais tester tout cela ! Merci de votre aide ;) !
0
Rejoignez-nous