Conversie data din coloana tip Varchar in mysql
Discutii despre script-uri si coduri PHP-MySQL, precum si lucru cu XML in PHP.
-
andras
- Mesaje: 430
Conversie data din coloana tip Varchar in mysql
Salut,
Vreau sa fac in BD un filtru care nu-mi iese. In BD am cimpuri:
Cod: Selectaţi tot
sisdata (varchar 30) - este incarcat cu valoarea timestamp() in momentul incarcarii (ex. 2013-06-08 17:38:18)
pn (varchar, 200)
denumire (varchar, 200)
In php am:
Cod: Selectaţi tot
$data= date('Y-m-d');
$dataveche=date('Y-m-d', strtotime($data. ' - 14 month')); // valoarea filtru, in cazul nostru 2014-04 -10
Am dat:
Cod: Selectaţi tot
SELECT DISTINCT pn, denumire from pozitii
WHERE DATE(sisdata)>=".$dataveche." AND (pn LIKE "."'%".$pn."%' AND denumire LIKE "."'%".$den."%')
dar in query imi scoate si pozitiile cu date(sisdata) anterioare valorii filtrului (adica imi preia si o pozitie incarcata in anul 2013)
Unde am gresit? Multumesc.
- Completare: si in PhpMyAdmin tot asa preia, cu date anterioare. Cimpul sisdata este cimp de rezerva, eu il folosesc numai pentru trasabilitatea produsului, de asta l-am pus varchar iar acum e greu sa modific BD.
MarPlo
Mesaje: 4343
Salut
Incearca sa faci verificarea datei transformata in Unix Timestamp.
Codul ar fi asa:
Cod: Selectaţi tot
$dataveche = strtotime('-14 month');
$sql = "SELECT DISTINCT pn, denumire from pozitii
WHERE UNIX_TIMESTAMP(sisdata) >= ". $dataveche ." AND (pn LIKE "."'%".$pn."%' AND denumire LIKE "."'%".$den."%')";
andras
Mesaje: 430
In PhpMyAdmin apare tot asa cu date anterioare, in aplicatie n-am mai verificat. Mai cautam, poate ne dumirim.
Am incercat si cu:
Cod: Selectaţi tot
SELECT DISTINCT pn, denumire from pozitii
WHERE str_to_date(sisdata, '%Y-%m-%d') >= ". $dataveche ." AND (pn LIKE "."'%".$pn."%' AND denumire LIKE "."'%".$den."%')
Tot asa preia cu date anterioare.
Daca nu reusim va trebui sa schimb query-ul (eventual sa modific BD), problema e ca nu stiu de ce apare asa. Multumesc oricum.
MarPlo
Mesaje: 4343
Daca faci comparatia /conditia ">=" intre numere, ar trebui sa functioneze. Ambele valori comparate sa fie numere Timestamp (nu data tip string). Iar asta se obtine cu UNIX_TIMESTAMP(coloana) pentru data din mysql, si cu; strtotime('-14 month') pentru valoarea din php.
andras
Mesaje: 430
Exact asa am pus in aplicatie. Eu folosesc acest filtru pentru cautarea unor pozitii incarcate in ultimele 14 luni, cu ideea de a prelua PN si DENUMIRE cind incarc pozitii noi care se repeta.
MarPlo
Mesaje: 4343
Poate ca problema e de la valoarea returnata de strtotime(). Da un "echo" la interogarea $sql sa vezi ce sir e trimis la mysql.
Eventual incearca si asa, fara strtotime().
Cod: Selectaţi tot
$sql = "SELECT DISTINCT pn, denumire from pozitii
WHERE UNIX_TIMESTAMP(sisdata) >= UNIX_TIMESTAMP((NOW() - INTERVAL 14 MONTH)) AND (pn LIKE "."'%".$pn."%' AND denumire LIKE "."'%".$den."%')";
andras
Mesaje: 430
Acum functioneaza corect. Deci asta era, nu-i placea $dataveche. Multumesc mult MarPlo, problema rezolvata.