I en databastabell har jag gjort ett datumattribut, men jag har ställt in dess typ till varchar
och inte Date
. Min fråga är: kommer jag fortfarande att kunna jämföra sådana datum i en SQL-fråga?
Datum i min DB lagras i det här formatet:
dd / mm / åååå hh: mm: ss
Jag måste göra en SQL-fråga i PHP som ser ungefär så här ut:
SELECT * FROM DBtable WHERE DBname="$name" AND date>="31/01/2015" AND date<="31/09/2015";
”date” ser ut så här: 07/08/2015 15:15:02
Jag skulle uppskatta ett exempel på hur för att göra detta.
Kommentarer
Svar
Beroende på vilken databas du använder, du borde kunna kasta strängen till ett datum och sedan göra din jämförelse.
dvs. i SQL Server
cast(date as datetime) >= "20150131" ...
Som sagt, jag rekommenderar vanligtvis att spara datumet som ett datum om det är möjligt, och om du behöver använda strängar, Det är bäst att använda ett mer standardiserat format
dvs. "YYYY-mm-dd"
eller ännu bättre "YYYYmmdd"
istället för "mm/dd/YYYY"
som till exempel enkelt kan blandas upp med "dd/mm/YYYY"
vilket är vanligt i många kulturer. Se detta blogginlägg: Dåliga vanor att sparka: fel hantering av datum / intervallfrågor
Kommentarer
- och det ' rekommenderas vanligtvis att använda en standard fromat för datum, som
'YYYY-mm-dd'
eller ännu bättre'YYYYmmdd'
och inte'mm/dd/YYYY'
som är tvetydig och dess tolkning av SQL-Server beror på lokala inställningar. - @ypercube, Agreement , uppdaterad.
Svar
Det finns en fråga om ”Vilken databas använder du?”
Varje RDBMS har sitt eget sätt att hantera problemet.
Om det är MySQL, använd str_to_date:
https://dev.mysql.com/doc/refman/5.1/en/date-and-time-functions.html#function_str-to-date
Detta konverterar en varchar till ett datum och gör det möjligt att sortera datumet korrekt. Att sortera ett datum som en varchar-datatyp kommer att leda till oväntat beteende.
dates
snarare än strängar, finns det någon anledning att du inte kan ändra tabelldefinitionen nu? Eller ber du också om hjälp med att göra det?