Date au format text dans BDD

fabricephp88
Invité n'ayant pas de compte PHPfrance

23 janv. 2014, 20:15

Bonjour,
dans une base de donnée j'ai un champ datedebut (qui n'est malheureusement pas au format DATE mais au format Text).
Je souhaite lors de l’affichage de mes données faire un trie par date mais le soucis est que comme il n'est pas au format DATE le trie n'est pas bon.
j'ai donc un trie du genre :
01-03-2014
02-03-2014
03-02-2014
08-02-2014
08-03-2014

au lieu de
03-02-2014
08-02-2014
01-03-2014
02-03-2014
08-03-2014

j'ai essayé dans ma requette d’utiliser STR_TO_DATE() mais... sa ne fonctionne pas, rien ne s'affiche. (c'est peut être pas la bonne méthode)
				
$sql = "SELECT DISTINCT table1.refreserv, table2.id, nom, STR_TO_DATE('datedebut','%d-%m-%Y'), datefin, nbrlocations FROM table1 LEFT JOIN table2 ON (table2.refreserv = table1.refreserv) order by datedebut";
$req = mysql_query($sql) or die('<u>Probleme SQL</u> : '.$sql.'<br>'.mysql_error());  
				
while($resultat = mysql_fetch_array($req)) 
{
	echo $resultat['datedebut']; 
}


Mammouth du PHP | 2278 Messages

23 janv. 2014, 21:12

Il faut remplacer les appels à mysql par des appels à mysqli ou pdo (raison officielle:la bibliothèque mysql n'est plus maintenue et sera abandonnée à terme).
$sql = "SELECT DISTINCT table1.refreserv, table2.id, nom, STR_TO_DATE('datedebut','%d-%m-%Y'), datefin, nbrlocations FROM table1 LEFT JOIN table2 ON (table2.refreserv = table1.refreserv) order by datedebut";
je tenterais :
$sql = "SELECT DISTINCT table1.refreserv, table2.id, nom, STR_TO_DATE('datedebut','%d-%m-%Y'), datefin, nbrlocations FROM table1 LEFT JOIN table2 ON (table2.refreserv = table1.refreserv) order by  STR_TO_DATE('datedebut','%d-%m-%Y')";
mais franchement ça irait aussi bien en convertissant tes dates en dates sql (quand tu voudras faire d'autres opérations sur tes dates de début et de fin, ce qui ne manquera pas d'arriver, tu te féliciteras de cet effort).
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

fabricephp88
Invité n'ayant pas de compte PHPfrance

23 janv. 2014, 21:16

merci pour ton aide mais du coup je n'ai plus les datedebut qui s'affiche dans ma while...

comment je peu convertir mon champs sans perdre mes dates ???

Mammouth du PHP | 2278 Messages

23 janv. 2014, 21:54

sauf erreur de ma part avec une table:
lesdates
datetext char(11)
ladate date
initialement ainsi remplie:
+------------+------------+
| date_text | ladate |
+------------+------------+
| 11-01-2014 | |
| 11-02-2014 | |
| 12-02-2014 | |
un coup de:
update lesdates set ladate=  STR_TO_DATE(date_text, '%d-%m-%Y');
donne ceci:
+------------+------------+
| date_text  | ladate     |
+------------+------------+
| 11-01-2014 | 2014-01-11 |
| 11-02-2014 | 2014-02-11 |
| 12-02-2014 | 2014-02-12 |
+------------+------------+
Vanitas vanitatum et omnia vanitas
Mes derniers livres :
Sauvez les Mots chez BoD,
Tous les chemins mènent à ROM chez BoD

ViPHP
ViPHP | 1996 Messages

23 janv. 2014, 22:11

Pourquoi ne pas convertir les dates dans PHP via strtotime (attention format américain obligatoire) et faire le tri via un sort() ?
It is nice to be important but it is more important to be nice
http://www.aureuswebfactory.fr

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

23 janv. 2014, 22:43

salut,

deux solutions
- Table heap (mémoire) que tu construis dynamiquement avec le bon nombre de colonne et un champ date plutot que texte dans lequel tu met la valeur à partir de datedebut (+ str_to_date).

- Garder ta requête mais faire le order by sur le résultat du str_to_date et pas sur le champs d'origine :mrgreen:
SELECT DISTINCT table1.refreserv,
                table2.id,
                nom,
                STR_TO_DATE('datedebut', '%d-%m-%Y') as monchampdate,
                datefin,
                nbrlocations
  FROM table1
  LEFT JOIN table2
    ON (table2.refreserv = table1.refreserv)
 order by monchampdate
@+
Il en faut peu pour être heureux ......

fabricephp88
Invité n'ayant pas de compte PHPfrance

24 janv. 2014, 10:32

Merci pour vos infos,
je viens de tester :
SELECT DISTINCT table1.refreserv,
                table2.id,
                nom,
                STR_TO_DATE('datedebut', '%d-%m-%Y') AS monchampdate,
                datefin,
                nbrlocations
  FROM table1
  LEFT JOIN table2
    ON (table2.refreserv = table1.refreserv)
 ORDER BY monchampdate
le probleme c'est que quand je fais un echo $resultat['monchampdate']; pour voir mes dates rien ne s'affiche

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 8758 Messages

24 janv. 2014, 10:56

la le plus simple c'est de fournir les structure de table avec de données minimaliste pour ne pas rester dans le flou .

les requêtes sont a tester dans un client sql avant des utiliser avec php ;)

@+
Il en faut peu pour être heureux ......