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

时间:2012-07-05 18:22:20

标签: 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;
}

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

7 个答案:

答案 0 :(得分: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'";

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

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

另外,我在SQL中使用BETWEEN语法,因为它与val >= val1 AND val <= val2相同。它更清晰,更简单:val BETWEEN val1 AND val2

答案 1 :(得分:1)

您需要将日期存储为DATE字段类型或DATETIME字段类型。使用脚本迁移数据库(在小型数据库上不应该太难:备份您的表,将所有日期转换为正确的格式,更改架构,然后重新插入数据。如果备份爆炸,请恢复备份。修好后,一切都会按预期工作。

答案 2 :(得分:1)

我会强烈建议你现在通过将字段转换为正确的DATE字段来解决这个问题并承担痛苦,而不是等到这种方法出现的不可避免的性能问题出现。如果你不能,试试这个:

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

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

$sel = "SELECT * FROM bestelling WHERE SUBSTRING(verzenddatum, 7, 4) BETWEEN '$fromyear' AND '$tillyear' AND SUBSTRING(verzenddatum, 4, 2) BETWEEN '$frommonth' AND '$tillmonth' AND SUBSTRING(verzenddatum, 1, 2) BETWEEN '$fromday' AND '$tillday';"

(希望如果记录的日期位于“年份”和“年份”之外,MySQL查询优化器会注意到这一点并提前纾困)

答案 3 :(得分:0)

MySQL的标准日期格式为“年 - 月 - 日”尝试此$vanaf = "$fromyear-$frommonth-$fromday";并对$tot执行相同操作。试试看,看看它是否有效。

答案 4 :(得分:0)

一些理论:

$startdate = sprinf('%04d-%02d-%02d', $year, $month, $day);
$enddate = sprinf('%04d-%02d-%02d', $year, $month, $day);

$query = "SELECT * FROM orders WHERE date BETWEEN '{$startdate}' AND '{$enddate}'";

我的tipp:花一些时间在PDO和准备好的声明中。不要再使用mysql_函数了。

答案 5 :(得分:0)

由于您使用的是PHP,因此可以将MySQL中的数据类型设置为INT(整数),并使用UNIX时间戳作为日期。这是搜索大于和小于值的好方法。

您可以使用以下内容:

$fromday = strtotime($_POST['fromday']);

答案 6 :(得分:0)

Change Only Mysql query it's Working.

select * from Your_table_name
where STR_TO_DATE(  "your_date_field" ,  '%d/%m/%Y' )
BETWEEN  STR_TO_DATE("your_first_date", '%d/%m/%Y')
AND  STR_TO_DATE("your_second_date", '%d/%m/%Y')