【问题标题】:Can we use PHP function strtotime in Mysql Query [closed]我们可以在 Mysql Query 中使用 PHP 函数 strtotime [关闭]
【发布时间】:2014-07-04 06:32:37
【问题描述】:

我有以下 MySQL 语法,这给了我一个错误。

我知道你不能直接比较日期变量,所以我使用strtotime 创建一个 Unix 时间戳来比较日期。

你能在 MySQL 查询中使用 PHP strtotime 函数吗?

$result = select * from table where strtotime(Date) >= strtotime($_POST[DateFrom1])  
&& strtotime(Date) <= strtotime($_POST[DateTo1])";

【问题讨论】:

  • PHP 不对!不,使用 PHP 无法将 MySQL 表字段从字符串转换为时间。
  • 是什么让你觉得不能在mysql中直接比较日期字段?可以,只要列类型是 datedatetime 或其他与日期相关的类型。

标签: php mysql strtotime


【解决方案1】:

您的代码必须是这样的:

$result = "select * from table 
              where unix_timestamp(Date) >= unix_timestamp(".$_POST[DateFrom1].")  
&& unix_timestamp(Date) <= unix_timestamp(".$_POST[DateTo1].")";

要在mysql中转换时间戳中的日期,有函数unix_timestamp

【讨论】:

  • + for unix_timestamp()
【解决方案2】:

您的代码是NOT 一个有效的PHP 语法。下面的代码是一种干净且正确的方法:

$from = date('Y-m-d', strtotime($_POST["DateFrom1"]));
$to = date('Y-m-d', strtotime($_POST["DateTo1"]));
$query = "select * from table where date between '$from' and '$to'";
// use this query to your mysqli

【讨论】:

    【解决方案3】:

    不行,你需要使用here描述的mysql函数UNIX_TIMESTAMP

    所以可能类似于

    $sql = "SELECT * FROM table WHERE UNIX_TIMESTAMP(date) >= '" . strtotime($_POST[DateFrom1]) . "' && UNIX_TIMESTAMP(date) <= '" . strtotime($_POST[DateTo1]) . "';";
    

    最好使用Named Placeholders 和 PDO。

    $db = new PDO('mysql:host=whateverHost;dbname=yourDB;charset=utf8', 'username', 'password');
    $stmt = $db->prepare("SELECT * FROM table WHERE UNIX_TIMESTAMP(date) >= :dateFrom1 && UNIX_TIMESTAMP(date) <= :dateTo1");
    $stmt->execute(array(':dateFrom1' => $_POST[DateFrom1], ':dateTo1' => $_POST[DateTo1]));
    $rows = $stmt->fetchAll(PDO::FETCH_ASSOC);
    

    使用 PDO 意味着您不必担心诸如 SQL 注入之类的事情,并且它允许更干净的 SQL 语句,您不必将值从 PHP 直接扔到 SQL 中。

    【讨论】:

      【解决方案4】:

      假设您的 date 字段是 datedatetime 类型,那么您可以直接比较而不转换为时间戳。

      此外,对于您的具体情况,您似乎可以利用 expr BETWEEN min AND max 操作,这相当于 min

      $result = "
          SELECT * FROM table
          WHERE date BETWEEN '" . date('Y-m-d', strtotime($_POST['DateFrom1'])) . "'
              AND '" . date('Y-m-d', strtotime($_POST['DateTo1'])) . "'";
      

      SQLFiddle using type date

      SQLFiddle using type datetime


      注意:如果您将日期存储为 varchar 数据类型或 datedatetime(或者可能是 timestamp)以外的其他数据类型,那么您真的应该考虑更改它,以便充分利用 MySQL 的功能。

      【讨论】:

        【解决方案5】:

        使用 mysql 的 UNIX_TIMESTAMP() 可能就是你要找的。​​p>

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-09-18
          • 1970-01-01
          • 2012-12-18
          • 1970-01-01
          • 2012-07-08
          • 1970-01-01
          • 2014-06-25
          相关资源
          最近更新 更多