我正在尝试在产品到期日期的三个月之前收到通知。 expiry_date列在DB中存储为VARCHAR(存储月份和年份)。
<select name="month">
<?php
$months = array (
1=>'Jan',2=>'Feb',3=>'Mar',4=>'Apr',5=>'May',6=>'Jun',7=>'Jul',8=>'Aug',9=>'Sep',10=>'Oct',11=>'Nov',12=>'Dec');
?>
<option value="">Select Month</option>
<?php
foreach ($months as $key=>$value) {
echo '<option name="'. $key .'">'. $value .'</option>';
}
?>
</select>
<select name="year">
<?php
$Start_year=date('Y');
$end_Year=$Start_year+10;
$yearArray = range($Start_year,$end_Year);
?>
<option value="">Select Year</option>
<?php
foreach ($yearArray as $key=>$value) {
echo '<option name="'. $key .'">'. $value .'</option>';
}
?>
</select>
如果我运行此查询,则返回array(0){}。有人请帮我找出我错的地方
$futureDate = date('Y M', strtotime("+3 months"));
SELECT * FROM items WHERE expiry_date>$futureDate
答案 0 :(得分:0)
您需要将VARCHAR转换为DATE。
expiry_date 需要一天&#34; Y m 01&#34;。在MySQL中使用CONCAT&#34; 01&#34;因为 str_to_date 需要一天。
$ futureDate 需要一天,在PHP中添加一天或在MySQL中添加CONCAT。 这个查询工作正常。
SELECT *
FROM `test`
WHERE date_format(str_to_date(CONCAT(expiry_date, ' 01'), '%Y %m %d'), '%Y %m') > date_format(str_to_date('$futureDate', '%Y %m %d'), '%Y %m')
https://dev.mysql.com/doc/refman/5.7/en/date-and-time-functions.html#function_str-to-date
https://www.w3schools.com/sql/func_mysql_date_format.asp
在我的数据库中,表 test 有2列, id 和 expiry_date VARCHAR例如&#34; 2017 01&#34;
答案 1 :(得分:0)
在你的帖子中你说
expiry_date列存储为VARCHAR
表示在您的查询中
SELECT * FROM items WHERE expiry_date&gt; $ futureDate
您正尝试在VARCHAR值和DATE值之间进行日期比较,因为您将$ futureDate定义为DATE,
$ futureDate = date('Y M',strtotime(“+ 3 months”));
哪个不行。两者都必须是DATE格式的值。您需要将VARCHAR转换为DATE以进行比较。
例如:
$expiry_as_date = $year . '-' . $month . '-01';
$new_expiry_date = date('Y-m-d', strtotime($expiry_as_date));
SELECT * FROM items WHERE $new_expiry_date>$futureDate