使用WHERE作为日期过滤器的MySQL SELECT不起作用

时间:2017-06-10 22:56:07

标签: php mysql date

我正在使用以下SELECT脚本成功找到$payer_emailreminder_datesub_expire_date的值,但是当我应用注释时没有生成数据WHERE条件为SELECTWHERE的意图是过滤SELECT中的值,仅提前30天提供指向订阅到期(sub_expire_date)的值,但不会导出任何值当值存在时。 任何人都可以告诉我为什么SELECT未能包含WHERE

<?php
error_reporting(E_ALL ^ E_NOTICE);
include_once("../real_conn/real_i_conn.php");
$reminder_date = date("Y-m-d", strtotime("+30 days"));
echo $reminder_date . "<br><br>";
$sql = "SELECT sec_tblpurchased_secureareas.users_id, 
        sec_tblpurchased_secureareas.sub_expire_date, 
        DATE_ADD(sec_tblpurchased_secureareas.sub_expire_date, INTERVAL - 30 
        day) AS reminder_date, sec_tblusers.payer_email
        FROM sec_tblpurchased_secureareas
        INNER JOIN sec_tblusers ON sec_tblusers.recid = 
        sec_tblpurchased_secureareas.users_id";
//WHERE DATE_ADD(sec_tblpurchased_secureareas.sub_expire_date, INTERVAL- 30 day) = '". $reminder_date ."' ";
$result = mysqli_query($conni, $sql);
if ($result) {
    // Return the number of rows in result set
    $rowcount = mysqli_num_rows($result);
    printf("Result set has %d rows.\n", $rowcount);
    echo "<br><br>";
}
while ($num = mysqli_fetch_array($result)) {
    //echo $num;
    $payer_email = $num['payer_email'];
    echo $num['payer_email'] . "  <br>";
    $reminder_date = $num['reminder_date'];
    $reminder_date = date_create("$reminder_date");
    echo date_format($reminder_date, "Y/m/d") . " remind<br>";
    $sub_expire_date = $num['sub_expire_date'];
    $sub_expire_date = date_create("$sub_expire_date");
    echo date_format($sub_expire_date, "Y/m/d") . " expire<br><br>";
}
?>

3 个答案:

答案 0 :(得分:0)

您的代码非常难以阅读,并且您分享的代码无效(注释掉//WHERE行之前的行结束";但开始后的行- 30 - 这绝对不会编译。

那就是说,我最好的猜测是你错误地使用了DATE_ADD。请在此处查看相关文档:https://dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_date-add

请注意,它会返回DATETIME,而不是DATE。但是,如果将其包裹在DATE()电话中,您可能会得到您想要的结果。

答案 1 :(得分:0)

FWIW,我觉得这更容易阅读:

SELECT x.users_id
     , x.sub_expire_date
     , DATE_ADD(x.sub_expire_date, INTERVAL - 30 DAY) reminder_date
     , u.payer_email
  FROM sec_tblpurchased_secureareas x
  JOIN sec_tblusers u
    ON u.recid = x.users_id;

答案 2 :(得分:0)

我认为问题已经间接解决了。看起来我只需要使用

DATE_SUB(sec_tblpurchased_secureareas.sub_expire_date, INTERVAL 30 day) AS reminder_date

而不是具有负日值的DATE_ADD。这给了我触发CRON所需的变量。 谢谢你的帮助。