比较MySQLi WHERE子子句中的日期


Comparing dates in a MySQLi WHERE subclause

我是个新手。我想生成一个报告来统计那些时间戳位于两个日期之间的MySQLi记录。每条记录都有一个timestamp字段,该字段在MySQLi创建时自动生成。当我在phpMyAdmin中查看时间戳时,它们以以下格式2015-12-31 19:25:51显示。

我有一个PHP页面,其中包含HTML表单输入,使用单选按钮选择"Last 7 days"、"Last 30 days"answers"since records started"等。基于此选择,我有了一个Javascript,它将startdate和enddate变量创建为DATE对象,并使用JQuery$.post将这些变量发送到另一个PHP页以执行查询。

我在编写SQL查询时遇到了麻烦。我正在尝试类似的东西

$startdate = $_POST["startdate"];
$enddate = $_POST["enddate"];
$con = mysqli_connect("localhost","username","password","db");
if (mysqli_connect_errno())
{
echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql="SELECT * FROM dbtable WHERE timestamp BETWEEN $startdate AND $enddate";
if ($result = mysqli_query($con,$sql)) {
    $count = mysqli_num_rows($result);
}

如果我没有WHERE子条款,代码会很好地工作(但当然只是计算所有记录,这不是我想要的)。所以我知道问题出在WHERE子条款中。我怀疑问题在于MySQLi时间戳格式与我发布的变量的JS DATE对象格式不同。如果我可以将时间戳和JS变量都转换为整数(可能表示自1970年1月1日以来的毫秒数或类似值),那么比较就可以了。

您需要用以下内容替换您的两个日期变量(更改日期格式):

$startdate = date('Y-m-d h:i:s',strtotime($_POST["startdate"]));
$enddate = date('Y-m-d h:i:s',strtotime($_POST["enddate"]));

您的查询应该是这样的(添加单引号):

$sql="SELECT * FROM dbtable WHERE timestamp BETWEEN '$startdate' AND '$enddate'";

您应该用单引号将日期变量括起来。

$startdate = $_POST["startdate"];
$enddate = $_POST["enddate"];
$con = mysqli_connect("localhost","username","password","db");
if (mysqli_connect_errno())
{
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
}
$sql="SELECT * FROM dbtable WHERE timestamp BETWEEN '$startdate' AND '$enddate'";
if ($result = mysqli_query($con,$sql)) {
   $count = mysqli_num_rows($result);
}

尝试这种方式

$sql="SELECT * FROM dbtable WHERE timestamp BETWEEN '" . $startdate . "' AND '" . $enddate . "'";