ereg_replace sur date Mysql yyyy-mm-dd

ereg_replace sur date Mysql yyyy-mm-dd - PHP - Programmation

Marsh Posté le 26-05-2006 à 13:14:27    

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
Reply

Marsh Posté le 26-05-2006 à 13:14:27   

Reply

Marsh Posté le 26-05-2006 à 13:23:03    

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 ;)

Reply

Marsh Posté le 26-05-2006 à 13:29:18    

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
Reply

Marsh Posté le 26-05-2006 à 13:35:45    

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:  
 

Reply

Marsh Posté le 26-05-2006 à 14:57:57    

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
Reply

Marsh Posté le 26-05-2006 à 15:39:31    

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
Reply

Marsh Posté le 26-05-2006 à 15:50:03    

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
Reply

Marsh Posté le 26-05-2006 à 15:55:56    

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
Reply

Marsh Posté le 26-05-2006 à 15:59:45    

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
Reply

Marsh Posté le 26-05-2006 à 16:09:27    

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
Reply

Marsh Posté le 26-05-2006 à 16:09:27   

Reply

Marsh Posté le 26-05-2006 à 16:15:39    

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 ;)

Reply

Marsh Posté le 26-05-2006 à 16:48:53    

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
Reply

Marsh Posté le 26-05-2006 à 20:36:20    

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:

Reply

Marsh Posté le 26-05-2006 à 20:54:39    

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
Reply

Marsh Posté le 26-05-2006 à 21:18:59    

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:

Reply

Marsh Posté le 26-05-2006 à 21:53:26    

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

Reply

Marsh Posté le 26-05-2006 à 21:59:28    

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
Reply

Marsh Posté le 27-05-2006 à 08:29:18    

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" )

Reply

Marsh Posté le 27-05-2006 à 08:30:32    

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

Reply

Marsh Posté le 27-05-2006 à 09:33:58    

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

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed