我们可以在Mysql查询中使用PHP函数strtotime吗?


Can we use PHP function strtotime in Mysql Query

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

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

可以在MySQL查询中使用PHP strtotime函数吗?

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

你的代码必须是这样的:

$result = "select * from table 
              where unix_timestamp(Date) >= unix_timestamp(".$_POST[DateFrom1].")  
&& unix_timestamp(Date) <= unix_timestamp(".$_POST[DateTo1].")";
要在mysql中转换时间戳中的日期,有unix_timestamp函数。

您的代码是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

不,您需要使用这里描述的mysql函数UNIX_TIMESTAMP

可能是在

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

最好是使用命名占位符和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中。

假设date字段的类型为datedatetime,那么可以进行直接比较,而无需转换为时间戳。

此外,对于您的具体情况,看起来您可以使用expr BETWEEN min AND max操作,这相当于min <= expr AND expr <= max

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

SQLFiddle使用类型日期

SQLFiddle using type datetime


注意:如果你将日期存储为varchar数据类型或datedatetime(或timestamp)以外的数据类型,那么你应该真正考虑改变它,以便充分利用MySQL的功能

使用mysql的UNIX_TIMESTAMP(),它可能是你正在寻找的。