0

我有几个日期以以下格式存储为 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;
}

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

4

7 回答 7

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()将字符串转换为有效的 MySQLDATE类型。%d-%m-%Y是您当前在 varchar 字符串中使用的格式,但STR_TO_DATE会将其转换为'%Y-%m-%d'MySQL 可以用来进行范围比较的格式。

另外,我使用BETWEENSQL 中的语法,因为它与val >= val1 AND val <= val2. 它更清晰,更简单:val BETWEEN val1 AND val2.

于 2012-07-05T18:32:23.103 回答
1

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

于 2012-07-05T18:29:29.723 回答
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 查询优化器会注意到这一点并提前退出)

于 2012-07-05T18:44:43.963 回答
0

MySQL 的标准日期格式是 'year-month-day' 试试这个$vanaf = "$fromyear-$frommonth-$fromday";并对$tot. 试试看它是否有效。

于 2012-07-05T18:26:48.323 回答
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}'";

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

于 2012-07-05T18:30:25.460 回答
0

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

你可以使用类似的东西:

$fromday = strtotime($_POST['fromday']);
于 2012-07-05T18:32:13.787 回答
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')
于 2014-11-15T10:26:20.910 回答