我有以下MySQL语法,这给了我一个错误。
我知道您无法直接比较日期变量,因此我使用strtotime
创建一个Unix时间戳来比较日期。
您可以在MySQL查询中使用PHP strtotime
函数吗?
$result = select * from table where strtotime(Date) >= strtotime($_POST[DateFrom1])
&& strtotime(Date) <= strtotime($_POST[DateTo1])";
答案 0 :(得分:4)
您的代码必须是:
$result = "select * from table
where unix_timestamp(Date) >= unix_timestamp(".$_POST[DateFrom1].")
&& unix_timestamp(Date) <= unix_timestamp(".$_POST[DateTo1].")";
要在mysql中的时间戳中转换日期,有函数unix_timestamp
。
答案 1 :(得分:3)
您的代码是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
答案 2 :(得分:3)
假设您的date
字段属于date
或datetime
类型,那么您可以直接进行比较,而无需转换为时间戳。
此外,对于您的具体情况,您似乎可以使用 expr BETWEEN min AND max 操作,这相当于 min&lt; = expr AND expr&lt; = max 。
$result = "
SELECT * FROM table
WHERE date BETWEEN '" . date('Y-m-d', strtotime($_POST['DateFrom1'])) . "'
AND '" . date('Y-m-d', strtotime($_POST['DateTo1'])) . "'";
注意:如果您将日期存储为varchar
数据类型或date
或datetime
(或者timestamp
)以外的其他数据,那么您应该考虑改变这一点,以便充分利用MySQL的功能。
答案 3 :(得分:2)
不,您需要使用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注入等问题,并且它允许FAR更清晰的SQL语句,您不必将PHP中的值直接抛入SQL中。
答案 4 :(得分:0)
使用mysql的UNIX_TIMESTAMP()它可能就是你要找的东西。