我创建了一个报告,其中需要过滤两个日期之间的数据。
Column name
bookingdate - varchar
format --dd-mm-yyyy
下面是我的代码。这行得通,但可以获取所有数据,因为我认为我的bookingdate过滤器无法正常工作。
我的代码中是否需要任何日期转换?
if($_POST['fromdate']!='' && $_POST['todate']!='')
{
$fromdate = $_POST['fromdate'];
$todate = $_POST['todate'];
$cityname = $_SESSION['Auth']['city'];
$data = $database->getRows("SELECT *, GROUP_CONCAT(coupon) as cou,GROUP_CONCAT(coupondate) as coupondt FROM receipt_entry WHERE city_name = :cityname AND bookingdate BETWEEN :fromdate AND :todate GROUP BY book_no,receipt_no order by bookingdate asc"
,array(':fromdate'=>$fromdate,':todate'=>$todate,':cityname'=>$cityname));
}
您搞砸了mysql标准。
首先,您应该将日期存储在mysql native数据类型中date
,datetime
或者timestamp
您发送给mysql的任何输入日期值都应转换为yyyy-mm-dd
格式。
因此,首先需要将输入日期正确转换为上述格式,并假设您的输入日期也采用以下dd-mm-yyyy
格式。
$fromdate = $_POST['fromdate'];
$todate = $_POST['todate'];
$formdate_r = DateTime::createFromFormat('d-m-Y', $fromdate);
$todate_r = DateTime::createFromFormat('d-m-Y', $todate);
// This will have yyyy-mm-dd format
$formdate_sql = $formdate_r->format("Y-m-d");
$todate_sql = $todate_r->format("Y-m-d");
使用DateTime::createFromFormat
可以从输入转换任何格式。
查询中的下一个日期是格式为varchar的日期,dd-mm-yyyy
而不是实际日期,因此您需要转换为实际日期。该功能str_to_date
为您做到
mysql> select str_to_date('08-01-2015','%d-%m-%Y') as date ;
+------------+
| date |
+------------+
| 2015-01-08 |
+------------+
1 row in set (0.10 sec)
因此查询将为
$data = $database->getRows("SELECT *,
GROUP_CONCAT(coupon) as cou,
GROUP_CONCAT(coupondate) as coupondt
FROM receipt_entry
WHERE city_name = :cityname
AND str_to_date(bookingdate,'%d-%m-%Y') BETWEEN :fromdate AND :todate
GROUP BY book_no,receipt_no order by bookingdate asc
",array(':fromdate'=>$formdate_sql,':todate'=>$todate_sql,':cityname'=>$cityname));
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句