Bonjour,
Dans une bd, j'ai des champs date stockés au format VARCHAR je cherche une combine pour trier ces champs par mois existe-il une combine ou suis je obligé de modifier le format de stockage de mon champs ?
merci de votre aide.
Version imprimable
Bonjour,
Dans une bd, j'ai des champs date stockés au format VARCHAR je cherche une combine pour trier ces champs par mois existe-il une combine ou suis je obligé de modifier le format de stockage de mon champs ?
merci de votre aide.
ça dépend du format dans lequel tu stoque ta date dans ton champs texte...
si c'est YYYYMMDD, 0 soucis pour faire tes tris ;)
la valeur est stocké au format VARCHAR.... ex 10/01/2007
Utiliser des varchar pour les dates, c'est MAL!
Pour faire le tri, et bien tu va devoir t'amuser avec des ORDER BY split(date, '/'), etc.
Remarque, je ne suis absolument pas sur de la syntaxe, enfin je suppose qu'il doit bien y avoir une fonction SPLIT en mysql...
je m attendais un peu ace type de réponse je vais donc modifier mes champs et les passer en DATE mon pb est que je ne sais pas comment faire pour les afficher en format DD-MM-YYYY
actuellement je regarde les cours php, mais je vais ettre obligé d'utiliser strtotime() devant chaque champs date ?
merci
Moi j'utilise du varchar pour stocker mes dates, je trouve ca plus pratique et surtout plus permissif (si je change de sgbd je n'ai pas tous les problèmes de compatibilités donc pas de changement de code au moins).
En revanche la notation à la francaise est, pardonnez moi l'expression, merdique. J'utilise donc la notation anglaise pour les stocker ;)
Rien n'empeche le formatage en php pour eviter les modification sql lié à un changement de sgbd... au moins tu pourras plus facilement comparer et trier des date avec des vrai champs date.
De plus si tu change de sgbd, il n'y aura pas que les fonctions sql à modifier...
Donc c'est un peu une perte de temps et un ajout de code que de stocker des dates en texte.
bon,
j'essaie ca mais sans aucun resultat
le code est pas tres beau mais c est juste un bout pour essayer de comprendre !!Code:
1
2
3
4 <?php echo $data['id'];?> <?php echo $data['titre'];?> <?php echo $data['date']; echo date("d-m-Y H:i",strtotime ("$data['date']"));?><br />
si qq un 2 minutes pour eclairer ma lanterne.
merci
split ta date et reconstruit là avec mktime
http://fr3.php.net/mktime
Mais je continue à dire que ça serait beaucoup plus simple de mettre ton champ au format date. Puisque sous MySql tu pourrais faire un ORDER BY, et retourner ta date dans le format que tu souhaite avec DATE_FORMAT();
En plus c'est pas comme si tu changeais de sgbd tous les jours.
bon j'ai un peux avancé mais ca coice tjrs
je crois que les 2 requetes se melange les pinceaux et je n'arrive pas a trouver mon erreurCode:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31 // sélection DB mysql_select_db('testdate',$db) or die('Erreur de selection '.mysql_error()); // creation requete $sql = "SELECT id, titre FROM modifdate"; // envoie la requête $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); // envoie la requête $sql = "SELECT DATE_FORMAT(date,'%d/%m/%Y') FROM modifdate"; // envoie la requête $req = mysql_query($sql) or die('Erreur SQL !<br>'.$sql.'<br>'.mysql_error()); // boucle sur les enregistrments $alt=0; while($data = mysql_fetch_assoc($req)) { $alt%=2; // on affiche les info s ?> <br /> <?php echo $data['id'];?> <?php echo $data['titre'];?> <?php echo $data['date'];?><br /> <?php $alt++; } //end while
Unixtime les amis, unixtime...
Y a que ca de vrai :mrgreen:
Ta seconde requête ecrase la premiere.
pourquoi tu rassemble pas les deux en même temps ?
C'est mieux je pense.Code:SELECT id, titre, DATE_FORMAT(date,'%d/%m/%Y') as date FROM modifdate
Pourquoi ne pas stocker tout simplement le timestamp ? En un nombre tu as toutes les infos sur ta date , enfin moi je trouve ca plus pratique.
Après tu recupère le mois de ton timestamp ou alors tu fait un ORDER BY date DESC mais la tu aura le tri par tout les paramètres de la date et non plus par mois , je sais pas si c'est exactement ce que tu veut ;)
Timestamp c'est pratique quand tu veux une heure precise, mais pour une date toute simple ça sert a rien. Surtout si les champs date sont remplis manuellement et ne correxpondent pas à l'heure actuelle.
Tu ne stock pas une date de naissance en timestamp.
Aprés ça dépend de l'utilisation que tu en as, tu as de nombreuses façon de faire pour gérer tes dates.
merci a tous.
@deY:
j'ai oublier de preciser: j(ai passer mon champ au format DATE comme tu me le conseillais.
Je n'y ai meme pas penser, j'ai 4 gros pepins (à mon niveau) que je n'arrive pas à résoudre ils me prennent la tête et commencent sérieusement a m'enervé en vrai !!!Citation:
pourquoi tu rassemble pas les deux en même temps ?
je teste et post.
merci encore.
Hop petite précision du pourquoi je préfère le format texte.
Je suis partisan d'une certaine rigueur, et le format date correspondrait volontiers à ceci si seulement les différents SGBD proposaient une écriture standard. Je pense entre autre à ACCESS.... bien que n'étant pas fan de ce SGBD je préfère ne pas me bloquer de porte lorsque je conçois la BDD.
Aussi, afin d'être sur de ne pas modifier une parcelle de code pour pallier aux conflits d'interets de messieurs les créateurs de SGBD, je préfère utiliser un format passe partout : le VARCHAR. Certes je suis peut etre amené à écrire un peu plus de code à la création, mais cela m'assure une maintenance zéro (enfin façon de parler) si jamais on change de SGBD ;)
Cela ne reste que mon point de vue, pas une vérité absolue ^^
Oui c'est sur que c'est une solution de facilité, mais lors de la création de ta base, tu passes par une phase d'analyse et on doit appeler un chat un chat. Tu ne changes pas de sgbd tous les jours, alors tu as voulu trop vite et tu te rend compte que ton premier choix ne correspond pas.
Je ne vois aucun mal à mettre tous les champs en type texte, mais de toute façon si tu change de sgbd, tu es forcé de modifier ta base et ton code même pour un champs texte. En plus rien ne te force à utiliser des fonctions sql compliqué, tu peux tout faire dans ton code, si tu ne veux pas perdre une portabilité sur un autre sgbd.
Si tu utilise des fonctions concat, date_format, ou autre ça pose probléme oui, mais si tu n'applique que des requêtes sql stricts ça ne pose aucun soucis.
Moi personnellement je ne travail que sur PgSql, il est gratuit et puissant, un bon compromis entre un mysql assez limité, et un Oracle payant ou un SqlServer trop compliqué.
Mais c'est mon avis, et chacun utilise ce qu'il veut, mais c'est vraiment trop ce compliqué la vie que de mettre un champs texte pour une date, c'est comme saisir manuellement un identifiant, alors qu'il y a des AUTO_INCREMENT ou des SERIALS.
:yaisse2:
On peut quand même faire un certain nombre de choses avec des champs varchar pour les dates, tant qu'on garde le format anglophone; on peut par exemple faire un ORDER BY sans problèmes.
Oui, mais tu te vois demander à un utilisateur de saisir sa date au format anglophone ? Ca t'oblige donc à split et refaire ta date en format anglophone pour l'insérer en texte.
au lieu de (avec pgsql)Code:
1
2
3 list($j, $m, $a) = explode("/", $date); $date = $a.'-'.$m.'-'.$j;
Et en cas d'insertion automatique tu dois recupére la dateCode:
1
2 to_date('23/01/2007', 'DD-MM-YYYY')
Puis la mettre dans ta requête alors que tu peux mettre en valeur par defaultCode:
1
2 $date = date('d/m/Y');
NOW() ou autre pour un champs date.
Donc je reste sur ma position, je trouve ça galére, en tout cas je ne me suis jamais retrouver dans une situation ou un varchar était mieux.
Mais bon, c'est pas vraiment le sujet du topic :bug:
deY!,
C'est OK mais, car il y a un mais, sur un seul champ date !
explications:
J'ai 2 champs au format DATE date (jour du post) et datevent (jour de l'événement) la requète ci-dessus convertit uniquement le champs datevent.Code:
1
2 $sql = "SELECT id, titre,datevent,proprio,messaG,heure,date, DATE_FORMAT(date,'%d/%m/%Y') as datevent,date
Comment procéder pour que les 2 champs soient convertis dans cette même requète ???
Elle est bizarre ta requête pourquoi tu repetes plusiseurs fois les champs ?Citation:
Envoyé par urbalk
suffit non ?Code:$sql = "SELECT id, titre,DATE_FORMAT(datevent,'%d/%m/%Y') as datevent,proprio,messaG,heure,DATE_FORMAT(date,'%d/%m/%Y') as date
tu pourras effectuer ton ORDER BY sur date et datevent sans probléme puisqu'il s'effectuer avant, le DATE_FORMAT n'est qu'une presentation différente.
Je savais qu'il est possible de repeter plusieurs fois une même 'commande' (DATE_FORMAT) dans une requête.
je te remercie d'avoir résolu mon pb, d'avoir passer du temps pour me répondre.
J'ai tout de même compris beaucoup de choses dans ce topic.
reste 3 pb.
bon week-end.
merci
C'est quoi tes problémes ?
Au faite, solutionner c'est pas française, on dit résoudre... soit dans la phrase "résolu".
j'ai résolu :lol: de cette mannière
me reste plus qu'à afficher seulement les enregistrements postérieurs à la date du jour.Code:
1
2 $sql = "SELECT id, titre,DATE_FORMAT(datevent,'%d/%m/%Y') as datevent,proprio,messaG,heure,DATE_FORMAT(date,'%d/%m/%Y') as date FROM message WHERE datevent LIKE '%2007-01%' ORDER BY datevent DESC";
Tu peux faire
Code:[...]WHERE datevent < CURDATE()[...]
juste en passant, CURDATE () fonctionne au format US ???
si c'est le cas, il faut que dans mon script, je convertisse la date qui est retournée au format Fr, au format US
j'ai fais un essais en placant CURDATE là ou te me le recommande et bin ca vas pô:cry:
a+
Avec l'interface PhpMyAdmin fournit avec EasyPhp et la version 4.1.9 de MySql.
J'ai crée la table
tabledetest (id, date, datetime, timestamp, desc);
le nom des champs indique leur type.
J'ai insérer
j'ai faitCode:
1
2 1 2007-03-20 2007-03-20 09:42:37 2007-03-20 09:42:37 (vide) 2 1993-03-16 2017-03-10 00:00:00 2007-03-20 09:43:09 (vide)
Je récupéreCode:SELECT id, DATE_FORMAT(date, '%d/%m/%Y') as date FROM `tabledetest` WHERE date < CURDATE();
Donc chez moi ça fonctionne.Code:2 16/03/1993
Puisque j'ai indiqué < et non <= (strictement inférieur, et non inférieur ou égal).
C'est tres sympa de prendre de ton temps pour faire des tests MERCI
C'est peu etre le LIKE qui mets la panik.je regarde tout ca se soir
a+
Si tu cherches à récuperer les event du mois de Janvier par exemple, moi j'aurais plutot utilisé un BETWEEN
Certes c'est un peu plus long, mais personnellement je trouve ça plus sûr.Code:WHERE datevent BETWEEN #2007-01-01# AND #2007-01-31#
PS: Il n'y a pas de quoi.
Salut,
Je m'explique un peu:
avec cette requete:
1/ j'ai repris ton exemple avec la table 'tabletest', mot pour mot et champ pour champ sous Easyphp, CA MARCHECode:
1
2 $sql = "SELECT id, DATE_FORMAT(date, '%d/%m/%Y') as date FROM `testcurdate` WHERE date < CURDATE()";
2/ j'ai dropper le table sur mon serveur (SME-Server 7 à jours) CA MARCHE
3/ j'ai insérer dans ma table (celle ou doit fonctionner la requete) un champ TIMESTAMP j'ai mis a jours manuellement ce champs avec la date du jour de post qui correspont a mon champs 'date'.j'ai adapté ma requette de cette manniere:
et bien CA NE MARCHE PAS !!! (je n ai plus de cheveux)... la requete ne renvoi rien. j'ai aussi essayer d'inversé le signe <> c'est pareil, renvoi vide...Code:
1
2 $sql = "SELECT id, titre,DATE_FORMAT(datevent,'%d/%m/%Y') as datevent,proprio,messaG,heure,DATE_FORMAT(date,'%d/%m/%Y') as date FROM message WHERE datevent < CURDATE() BETWEEN '2007-03-01' AND '2007-03-31' ORDER BY datevent DESC ";
Est-il possible que tu jete un oeil à ma table et mon fichier php ???
Désolé de te demander je ne voudrais pas que tu pense que je ne me casse pas la tete ce N EST PAS le cas sur cette connerie de date j'ai passé deja 8 heures
merci
Ton BETWEEN ne va pas.
Concretement tu demandes à selectionner les messages du mois de mars qui sont "depassé", sauf si je comprend mal ta requête. Je me demande si ça ne serait pas plus simple de faire :Code:
1
2 WHERE datevent < CURDATE() AND datevent BETWEEN '2007-03-01' AND '2007-03-31'
Mais je ne suis pas sur que cette syntaxe fonctionne.Code:WHERE datevent BETWEEN '2007-03-01' AND CURDATE()
Salut
Citation:
messages du mois de mars qui sont "depassé", sauf si
non, je cherche à afficher les messages restant a venir
ex: dans ma db j'ai des messages pour le 10-03; 12-03; 25-03; 30-03; nous sommes le 20 je voudrais afficher les messages restant depuis cette date mais en inversant '<>' ca fonctionne.
PS : je viens juste de c/c ta requete
dans mon code celle-ci affiche les enregistrement AVANT la date du jour...Code:
1
2 WHERE datevent BETWEEN '2007-03-01' AND CURDATE()
a+
D'accord j'avais donc mal compris l'utilité de ta requête.
Il faut donc que tu fasses
Code:
1
2 WHERE datevent BETWEEN CURDATE() AND '2007-03-31'
Yes !!!
:king:
MERCI.