Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1532 connectés 

  FORUM HardWare.fr
  Programmation
  PHP

  ereg_replace sur date Mysql yyyy-mm-dd

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

ereg_replace sur date Mysql yyyy-mm-dd

n°1375487
Mosca
Posté le 26-05-2006 à 13:14:27  profilanswer
 

Yello
 
Soit un fetch et une boucle toute bête.
Je sélectionne un champ date qui par défaut apparait yyyy-mm-dd, or je voudrais dd-mm-yyyy.
J'ai l'impression de foirer un truc tout bête dans mon ereg_replace, ou de ne pas le positionner au bon endroit (de la ligne ou du fetch)
 

Code :
  1. while($data=mysql_fetch_row($query))
  2. {
  3. echo "<tr>\n";
  4. echo "<td>" . "<font size=2>" . $data[0] . "</font></td>";
  5. echo "<td>" . "<font size=2>" . ereg_replace("^([0-9]{4})-([0-9]{2})-([0-9]{2})$","\\1-\\2-\\3",$data[1]) . "</font></td>";
  6. #echo "<td>" . "<font size=2>" . $data[1] . "</font></td>";
  7. echo "<td>" . "<font size=2>" . $data[2] . "</font></td>";
  8. echo "<td>" . "<font size=2>" . $data[3] . "</font></td>";
  9. echo "<td>" . "<font size=2>" . $data[4] . "</font></td>";
  10. echo "<td>" . "<font size=2>" . $data[5] . "</font></td>";
  11. echo "<td>" . "<font size=2>" . $data[6] . "</font></td>";
  12. echo "</tr>\n";
  13. }


 
 
Any idea ?


Message édité par Mosca le 26-05-2006 à 13:14:56
mood
Publicité
Posté le 26-05-2006 à 13:14:27  profilanswer
 

n°1375496
Daemam
Posté le 26-05-2006 à 13:23:03  profilanswer
 

Le plus simple est de formater la date direct à la source (requête) :
 
select date_format(date_table,"%d-%m-%Y" ) from...
 
Sinon => ereg_replace("^([0-9]{4})-([0-9]{2})-([0-9]{2})$","\\3-\\2-\\1",$data[1])
 
T'as inversé l'ordre des éléments à afficher ;)

n°1375502
Mosca
Posté le 26-05-2006 à 13:29:18  profilanswer
 

J'ai mal interprété le "\\3-\\2-\\1", et donc oui j'ai fatalement inversé :/
Et formater dans le select, bien sûr ...  
 
Thanks  :jap:

Message cité 1 fois
Message édité par Mosca le 26-05-2006 à 13:30:13
n°1375507
Daemam
Posté le 26-05-2006 à 13:35:45  profilanswer
 

Mosca a écrit :

Et formater dans le select, bien sûr ...


C'était une réponse ironique ou... ? :o
(des fois, c'est pratique... des fois, moins :whistle: )
 


Ca arrive les vendredi  :ange:
 
 :hello:  
 

n°1375585
Mosca
Posté le 26-05-2006 à 14:57:57  profilanswer
 

Daemam a écrit :

C'était une réponse ironique ou... ? :o
(des fois, c'est pratique... des fois, moins :whistle: )
 
 
Ca arrive les vendredi  :ange:
 
 :hello:


 
 
Non non, pas ironique ...
C'est ce que je fais d'habitude, mais je sais pas là j'avais un ereg_replace sous les yeux ... [:spamafote]
 
edit : en effet, un date_format foire mon order by sur la date :/


Message édité par Mosca le 26-05-2006 à 15:02:01
n°1375604
Sh@rdar
Ex-PhPéteur
Posté le 26-05-2006 à 15:39:31  profilanswer
 

le date_format foire rien du tout pour un tri (si xtof passe par là :hello:)
 
montre ta requête stp ;)


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°1375610
Mosca
Posté le 26-05-2006 à 15:50:03  profilanswer
 

Code :
  1. select a.item, DATE_FORMAT(b.date,"%d-%m-%Y" ), b.gsig, b.bsig, b.nsig, b.fsig, b.isig
  2. from pi_itm a, pi_sig b
  3. where a.item = b.item
  4. and a.csig = '070' and substr(a.item,13,13) <> 'x'
  5. and a.item = 'AAA.AAAA.000'
  6. order by 1, 2 asc;


 
Donne :
 
| AAA.AAAA.000  | 10-03-2006                     | 060  | #### | #### | 060    | #### |
| AAA.AAAA.000  | 13-02-2006                     |      | #### | #### | ------ | #### |
| AAA.AAAA.000  | 15-05-2006                     | 070  | #### | #### | 060    | #### |
| AAA.AAAA.000  | 16-02-2006                     | 060  | #### | #### | ------ | #### |
 
Item est dans l'ordre (oui, là y en a qu'un seul, mais c'est kifi kif), les dates pas :o


Message édité par Mosca le 26-05-2006 à 15:53:13
n°1375617
Sh@rdar
Ex-PhPéteur
Posté le 26-05-2006 à 15:55:56  profilanswer
 

order by 1, 2  :??: en mettant order by b.date ça irait pas mieux ?


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°1375619
Mosca
Posté le 26-05-2006 à 15:59:45  profilanswer
 

Si , en effet :o
Mais je fais toujours by 1, 2, ...  :p (et je sais que c'est pas super, mais c'est plus court)
Si je mets b.date au lieu de format_date(...) et que je garde le order by 1, 2 asc : l'ordre est correct.
Y a un binz quelque part non ? En quoi le format_date (voire tout type de format sur un champ) réagit mal avec le order by 1, 2 ?
 
Pourquoi faire l'order by sur le jour (première valeur du champ 2) alors qu'à mon sens tout le format_date forme un seul champ ...
Ou alors il interprète format_date comme un 'string' et non comme une date ...


Message édité par Mosca le 26-05-2006 à 16:04:27
n°1375626
Daemam
Posté le 26-05-2006 à 16:09:27  profilanswer
 

Sh@rdar a écrit :

order by 1, 2  :??: en mettant order by b.date ça irait pas mieux ?


Ca fonctionne très bien comme ça ;) ... Enfin, normalement :D
 
@Mosca : pour les dates, c'est normal, il va trier les dates par rapport à ton date_format donc le résultat n'est faux en soi :o
(ça te retourne bien un "string" et plus un "date" )

Code :
  1. select a.item, DATE_FORMAT(b.date,"%d-%m-%Y" ), b.date, b.gsig, b.bsig, b.nsig, b.fsig, b.isig
  2. from pi_itm a, pi_sig b
  3. where a.item = b.item
  4. and a.csig = '070' and substr(a.item,13,13) <> 'x'
  5. and a.item = 'AAA.AAAA.000'
  6. order by 1 asc, 3 asc;


Tu rajoutes "b.date" dans ton select sans date_format et tu tries là-dessus ;)
 
Edit : balise "gras"... ça marche pas dans les cpp :cry:
Je ne sais pas si j'ai été très compréhensible [:joce]


Message édité par Daemam le 26-05-2006 à 16:12:27
mood
Publicité
Posté le 26-05-2006 à 16:09:27  profilanswer
 

n°1375632
Mosca
Posté le 26-05-2006 à 16:15:39  profilanswer
 

Le order by 1, 2 ne fonctionne pas avec date_format ... Je peux te faire un screenshot des deux queries si tu veux :o
Ton astuce fonctionne, mais à quoi bon sélectionner 2x le champ juste pour l'order by, vu qu'après je dois le virer de mon fetch ...
Au final : ereg_replace est très bien ;)

n°1375646
Sh@rdar
Ex-PhPéteur
Posté le 26-05-2006 à 16:48:53  profilanswer
 

faire une regexp plutôt que d'avoir une requête explicite :??:
 
c'est quand même plus "logique" d'avoir un vrai JOIN et un vrai nom de champ pour le tri non ??


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°1375754
Daemam
Posté le 26-05-2006 à 20:36:20  profilanswer
 

Mosca a écrit :

Le order by 1, 2 ne fonctionne pas avec date_format ... Je peux te faire un screenshot des deux queries si tu veux :o
Ton astuce fonctionne, mais à quoi bon sélectionner 2x le champ juste pour l'order by, vu qu'après je dois le virer de mon fetch ...
Au final : ereg_replace est très bien ;)


Si tu veux un order by 1, 2 asc, t'as pas le choix...
Je ne voulais pas bousculer tes habitudes :sweat: :whistle:
 
Maintenant si tu veux une vraie solution sans avoir recours à une ereg :o
 

Code :
  1. select a.item, DATE_FORMAT(b.date,"%d-%m-%Y" ), b.gsig, b.bsig, b.nsig, b.fsig, b.isig
  2. from pi_itm a, pi_sig b
  3. where a.item = b.item
  4. and a.csig = '070' and substr(a.item,13,13) <> 'x'
  5. and a.item = 'AAA.AAAA.000'
  6. order by a.item asc, b.date asc;


 
Ca va mieux une fois que j'ai mangé :D
Ca va te sortir la date formatée et ça va trier sur la date en format MySQL (yyyy-mm-jj)
 

Sh@rdar a écrit :

faire une regexp plutôt que d'avoir une requête explicite :??:
 
c'est quand même plus "logique" d'avoir un vrai JOIN et un vrai nom de champ pour le tri non ??


:jap:

n°1375762
Mosca
Posté le 26-05-2006 à 20:54:39  profilanswer
 

Nan mais  :sweat: , à la fin !
 
J'ai bien saisi, merci ;)
Ca me semble toujours un peu "bizarre", mais bon ...  :sarcastic:  
En tous c'est bon à savoir pour les prochaines conversions de champs avec des order by 1, 2 ...
 
 :hello:


Message édité par Mosca le 26-05-2006 à 20:54:54
n°1375766
Daemam
Posté le 26-05-2006 à 21:18:59  profilanswer
 

Qu'est ce qui te parait bizarre ? :??:
 
Ce que j'ai mis en dernier à l'avantage d'être simple et fonctionnel :D
J'utilisais les "order by 1,2" de temps en temps mais ça montre vite ses limites :)
 
:hello:

n°1375773
Mosca
Posté le 26-05-2006 à 21:53:26  profilanswer
 

C'est pas de la mauvaise volonté ;)
Y a sûrement un truc basique qui m'échappe.
Ma question est : je fais un "order by 2" sur "date_format" il fait un order sur le résultat du "date_format" qui est de type char et non date; si je fais un "order by b.date" il fait l'order sur un type date qui est néanmoins formatée ...
Je dois pas être clair ... Mais je vois pas la différence essentielle entre le order by 2 et order by b.date sur le date_format ...

n°1375776
Sh@rdar
Ex-PhPéteur
Posté le 26-05-2006 à 21:59:28  profilanswer
 

c'est peut être un bug, cette syntaxe est pas très utilisée [:spamafote]


---------------
La musique c'est comme la bouffe, tu te souviens du restaurant dans lequel t'as bien mangé 20 ans plus tôt, mais pas du sandwich d'il y a 5 minutes :o - Plugin pour winamp ©Harkonnen : http://harko.free.fr/soft
n°1375890
Daemam
Posté le 27-05-2006 à 08:29:18  profilanswer
 

Mosca a écrit :

C'est pas de la mauvaise volonté ;)
Y a sûrement un truc basique qui m'échappe.
Ma question est : je fais un "order by 2" sur "date_format" il fait un order sur le résultat du "date_format" qui est de type char et non date; si je fais un "order by b.date" il fait l'order sur un type date qui est néanmoins formatée ...
Je dois pas être clair ... Mais je vois pas la différence essentielle entre le order by 2 et order by b.date sur le date_format ...


Ok, je vois :)
Ca me parait super clair dans ma tête mais j'arrive pas l'expliquer :D
 
DATE_FORMAT(b.date,"%d-%m-%Y" ) te sort une date de type : dd-mm-yyyy
Si tu tries sur ce résultat, il va commencer par les jours; puis si les jours sont identiques, il va comparer les mois en plus; puis si les mois sont identiques, il va comparer les années en plus.
 
Ce qui te donne :

Code :
  1. | AAA.AAAA.000  | 10-03-2006
  2. | AAA.AAAA.000  | 13-02-2006
  3. | AAA.AAAA.000  | 15-05-2006
  4. | AAA.AAAA.000  | 16-02-2006


 
10 < 13 < 15 < 16...
Il ne tient pas compte des mois car il a pu trier sur les jours. Pour que ce soit trié correctement dans l'order croissant, il aurait fallu que les années et les mois soient identiques.
 
b.date te sort une date de type : yyyy-mm-dd (en ayant le date_format pour formater ta date en sortie, mais il n'intervient pas dans l'order)
Si tu tries sur ce résultat, il va commencer par les années; puis si les jours sont années, il va comparer les mois en plus; puis si les mois sont identiques, il va comparer les jours en plus.
 
Ce qui te donne :

Code :
  1. | AAA.AAAA.000  | 13-02-2006
  2. | AAA.AAAA.000  | 16-02-2006
  3. | AAA.AAAA.000  | 10-03-2006
  4. | AAA.AAAA.000  | 15-05-2006


 
En fait, quand tu veux trier une date, il faut le faire obligatoirement sur un format yyyy-mm-dd :jap:
C'est là que "order by 1,2" montre ses limites. C'est pour ça qu'il faut trier sur b.date (format yyyy-mm-dd) et non le date_format (dd-mm-yyyy, impossible de trier dessus)
 
Que ce soit un type varchar ou date en sortie ne change rien (ça reste une chaine de caractères au final pour le tri).
 

Mosca a écrit :

Mais je vois pas la différence essentielle entre le order by 2 et order by b.date sur le date_format ...


Le order by 2 trie sur le date_format en sortant le résultat du date_format.
Le order by b.date trie sur b.date en sortant le résultat du date_format.
 
En fait, la clause "order by" est dissociée du select. Tu peux trier sur un champ qui n'appartient pas à ton select (du moment qu'il appartient à une table du "from" )

n°1375891
Daemam
Posté le 27-05-2006 à 08:30:32  profilanswer
 

Je me rends compte que j'ai carrément pas été clair [:ddr555]

n°1375900
Mosca
Posté le 27-05-2006 à 09:33:58  profilanswer
 

Non non, c'est bien ce que je pensais ;)
Mais tu confirmes  :jap:  


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  PHP

  ereg_replace sur date Mysql yyyy-mm-dd

 

Sujets relatifs
Comment installer la date en temps réel dans un textbox ?Date avec un Timestamp
[MySQL] Tri sur la premiere requete avec uniondate
MySQL : fichier MYI corrompupetit probleme de selection multiple avec date
[PHP]Problême avec une requête mysql[Vb.net] Date
Comment initialiser les variables MySQL en PHP ?Java -> Date, probleme d exception ?!
Plus de sujets relatifs à : ereg_replace sur date Mysql yyyy-mm-dd


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR