在到期日之前获得通知

时间:2017-10-13 17:18:04

标签: php mysql

我正在尝试在产品到期日期的三个月之前收到通知。 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 

2 个答案:

答案 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