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.

Subiecte similare