我有几个日期存储为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;
}
请让我知道我做错了什么!
答案 0 :(得分:5)
它没有返回任何行,因为查询没有在有效的DATE
或DATETIME
字段上进行比较。您应该将日期存储为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')