Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 在日期之间搜索(日期为VARCHAR)_Php_Mysql_Date_Between - Fatal编程技术网

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

Php 在日期之间搜索(日期为VARCHAR),php,mysql,date,between,Php,Mysql,Date,Between,我有几个日期存储为varchar,格式如下:01-01-2012 我想在两个日期之间搜索,但遗憾的是它没有像我预期的那样工作。我寻找了其他有同样问题的线程(有点),但是这里提供的答案对我不起作用 这是我的密码: $fromday = $_POST['fromday']; $frommonth = $_POST['frommonth']; $fromyear = $_POST['fromyear']; $tillday = $_POST['tillday']; $tillmonth = $_PO

我有几个日期存储为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;
}
$fromday=$\u 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”;
//佐肯

$sel=“SELECT*FROM bestelling,其中verzendatum>='$vanaf'和verzendatumMySQL的标准日期格式是'year-month-day',请尝试以下
$vanaf=“$fromyear-$frommonth-$fromday”";
并对
$tot
执行相同的操作。试试看是否有效。

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

一些理论:

$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函数了。

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

您可以使用以下内容:

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

它没有返回任何行,因为查询没有对有效的
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\u real\u escape\u string()
函数简单地降低了SQL注入的风险,而这正是原始代码容易受到攻击的地方

MySQL函数将字符串转换为有效的MySQL
DATE
类型
%d-%m-%Y
是当前varchar字符串中的格式,但是
STR\u TO\u DATE
将其转换为
%Y-%m-%d'
,MySQL可以使用该格式进行范围比较


另外,我在SQL中使用了
介于
之间的语法,因为它与
val>=val1和val是一样的。我强烈建议您现在将字段转换为正确的
日期
字段来解决这个问题,并承担相应的痛苦,而不是等到这种方法不可避免的性能问题出现。如果不能,请尝试以下操作:

$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';"

(这里的希望是,如果记录的日期不在“from year”和“to year”范围内,MySQL查询优化程序会注意到这一点并尽早退出)

为什么不将它们存储为
日期类型?如果它们已经是有效日期,那么您可以将模式更改为使用
DATE
DATETIME
。这会让你的生活变得越来越轻松。什么不管用?是不是在寻找不应该出现的日期?它根本没有做任何事情吗?它根本没有做任何事情。您需要将日期存储为任何类型的数字/整数,以便能够基于GT/LT值进行搜索。日期是什么样子的?如果将日期存储为天/月/年,则仅通过字符串比较无法正确过滤。例如,1990年1月22日将比2012年1月15日提前考虑,因为22是字符串开头的较大数字。要么更改日期字符串格式,要么只使用内置日期类型。嗯,我还有其他几个脚本使用此数据库,因此我想如果我更改类型,我的整个网站将无法工作,因为插入会中断。然后,你需要拉取所有行,忽略日期条件,在PHP中解析日期,然后在PHP中对其排序(这是一个糟糕的想法)。为什么要这样存储日期?如果可以使用本机日期类型,为什么要使用INT?@David OP的日期格式为
MM-DD-YYY
。(在PHP中)将
MM-DD-YYYY
转换为时间戳比将其转换为
YYYY-MM-DD
更容易。虽然我确实同意使用本机类型总是更好。考虑到这两种方式都需要一行代码:
echo new\DateTime($oldDate)->format('Y-m-d')@MBJHey成功了!你能再解释一下代码吗,这样我就能完全理解它在做什么了?@Andre他将数据库中的日期转换为每行的有效日期类型,并将其与
$vanaf
tot
进行比较。虽然这是可行的,但它最终会显示出来,因为每个查询都需要在每一行上转换
verzendatum
,以进行比较。如果有一百万行,则每次运行此查询时都会进行一百万次转换。将列更改为
DATE
DATETIME
可以为列编制索引,使其在数据库上更快/更方便。谢谢!我明白发生了什么:)
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')