在日期之间搜索(日期为VARCHAR)

And*_*dre 0 php mysql date between

我有几个日期存储为varchar,格式如下:01-01-2012

我想在日期之间进行搜索,但遗憾的是它没有像我预期的那样工作.我寻找其他具有相同问题的线程(有点),但那里提供的答案对我不起作用.

这是我的代码:

$fromday = $_POST['fromday'];
$frommonth = $_POST['frommonth'];
$fromyear = $_POST['fromyear'];

$tillday = $_POST['tillday'];
$tillmonth = $_POST['tillmonth'];
$tillyear = $_POST['tillyear'];

$vanaf = "$fromday-$frommonth-$fromyear";
$tot = "$tillday-$tillmonth-$tillyear";

// zoeken
$sel = "SELECT * FROM bestelling WHERE verzenddatum >= '$vanaf' AND verzenddatum <= '$tot'";
$dosel = mysql_query($sel) or die(mysql_error());

while($row = mysql_fetch_assoc($dosel))
{
    $datum = $row['verzenddatum'];

    echo $datum;
}
Run Code Online (Sandbox Code Playgroud)

请让我知道我做错了什么!

Zan*_*ien 5

它没有返回任何行,因为查询没有对有效DATEDATETIME字段进行比较.您应该将日期存储为DATE类型,但您可以这样做:

// Switch the order of date elements:
$vanaf = mysql_real_escape_string("$fromyear-$frommonth-$fromday");
$tot = mysql_real_escape_string("$tillyear-$tillmonth-$tillday");

$sel = "SELECT * FROM bestelling WHERE STR_TO_DATE(verzenddatum, '%d-%m-%Y') BETWEEN '$vanaf' AND 'tot'";
Run Code Online (Sandbox Code Playgroud)

mysql_real_escape_string()函数只是降低了SQL注入的风险,这是您的原始代码容易受到攻击的风险.

MySQL函数STR_TO_DATE()将字符串转换为有效的MySQL DATE类型.%d-%m-%Y是您当前在varchar字符串中的格式,但STR_TO_DATE将其转换为'%Y-%m-%d'MySQL可用于进行范围比较的格式.

此外,我正在使用BETWEENSQL中的语法,因为它是相同的val >= val1 AND val <= val2.它更清晰,更简单:val BETWEEN val1 AND val2.