2017-10-13 68 views
0

我試圖在產品失效日期的三個月前收到通知。 expiry_date列在數據庫中存儲爲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> 

如果我運行這個查詢,那麼它返回數組{0} {}。有人請幫我找出我的錯在哪裏

$futureDate = date('Y M', strtotime("+3 months")); 


SELECT * FROM items WHERE expiry_date>$futureDate 
+0

嘗試使用ISO-8601日期:'YYYY-MM-DD'。這是缺少一天的數字。 – tadman

+0

我不能在這裏使用日期 – Arsh

+1

如果不是日期,那麼'expiry_date'是什麼? – tadman

回答

0

你需要將你的VARCHAR轉換爲DATE。

expiry_date需要日「Y m 01」。在MySQL中使用CONCAT「01」,因爲str_to_date requiere天。

$ futureDate需要一天,在MySQL中添加PHP或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

在我的數據庫,表測試有2列,IDEXPIRY_DATE VARCHAR如 「2017年01」

0

在您的文章,你說

EXPIRY_DATE列存儲爲VARCHAR

這意味着,在您的查詢,

SELECT * FROM項WHERE EXPIRY_DATE> $ futureDate

你正在試圖使自定義$ futureDate爲DATE之後的VARCHAR值和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