代码之家  ›  专栏  ›  技术社区  ›  spice

MYSQL动态插入间隔日数?[副本]

  •  -1
  • spice  · 技术社区  · 5 年前

    我知道您可以使用CASE选择另一列的值来设置间隔:

    SELECT CASE some_column
           WHEN "SOME_VALUE" THEN date_add(date, INTERVAL value DAY)
           WHEN "SOME_OTHER_VALUE" THEN date_add(date, INTERVAL value DAY)
           END
           AS newDate
    FROM table
    

    但是我如何从脚本中传递这个数字(而不是数据库中的值)。

    例如,我有一个常量PHP脚本,它从.env文件中获取它的值:

    define("DOWNLOAD_DAYS", getenv("DOWNLOAD_DAYS")); // say this is 3 for example
    

    我的查询当前如下所示:

    $sql = 'SELECT * FROM orders WHERE user_id = :user_id 
            AND status = :status
            AND date_added > DATE_SUB(NOW(), INTERVAL 7 DAY)
            ORDER BY date_added DESC';
    

    我怎么能用 DOWNLOAD_DAYS 替换此查询中的7的常量?

    我试过。。。

    AND date_added > DATE_SUB(NOW(), INTERVAL DOWNLOAD_DAYS DAY)
    

    ... 这显然不起作用 INTERVAL 需要关键字,而不是字符串或变量。

    并尝试将整个命令与PDO绑定。。。

    $range = 'DATE_SUB(NOW(), INTERVAL ' . DOWNLOAD_DAYS . ' DAY)';
    ...
    AND date_added > :range
    ...
    $stmt->bindParam(':range', $range, PDO::PARAM_STR);
    

    .. 但这一切都没有。

    有什么建议吗?

    1 回复  |  直到 5 年前
        1
  •  1
  •   Nick SamSmith1986    5 年前

    您可以使用常量生成整个查询:

    $sql = 'SELECT * FROM orders WHERE user_id = :user_id 
            AND status = :status
            AND date_added > DATE_SUB(NOW(), INTERVAL ' . DOWNLOAD_DAYS . ' DAY)
            ORDER BY date_added DESC';
    

    或者你可以绑定到 只是 区间值

    $sql = 'SELECT * FROM orders WHERE user_id = :user_id 
            AND status = :status
            AND date_added > DATE_SUB(NOW(), INTERVAL :interval DAY)
            ORDER BY date_added DESC';
    $stmt->bindValue(':interval', DOWNLOAD_DAYS, PDO::PARAM_INT);