【问题标题】:Between dates where user inputs values sql在用户输入值 sql 的日期之间
【发布时间】:2015-01-16 08:21:22
【问题描述】:

我有一个表,其中有一个名为 hdate 的列。我已经用 date 属性设置了这个。

我有一个表格:

 <H2>Search By Date</H2></div>
  <form name="attdate" action="datesearch.php" method="post">
      From :<input id="datepicker" name = "startd">   To: <input id="datepicker1" name = "endd">
    <input type="submit" value="Search Records">

现在我的意图是允许用户输入开始日期和结束日期并获取所有具有这些日期的行。

<?php


include 'config.php';

$startd = ($_POST['startd']);
$endd = ($_POST['endd']);


$startd = mysqli_real_escape_string($con,$startd);
$endd = mysqli_real_escape_string($con,$endd);

$sql = "SELECT * FROM handover WHERE hdate  AND  >= '" . $startd . "' AND  <'"     

.$endd.  "' + ‘ 23:59:59’"
;
$result = mysqli_query($con,$sql);

$count=mysqli_num_rows($result);

if($count==0 ){

 echo "</br></br></br></br></br></br></br><p> No Matching results found</p>";
}
else{
while($row = mysqli_fetch_array($result)) {
 echo 'here are your results';

我的日期以与日期选择器设置的相同格式进入数据库以获取 hdate。

我成功获得查询其他列的结果。有任何想法吗?在几个网站上阅读后添加注意时间。我已阅读有关堆叠的其他问题,但它们与用户输入无关。

在使用当前设置进行测试时,我没有收到错误,只是“没有匹配项,所以我猜查询是有效的,但没有正确设置来查询我的 hdate 列。

我可以轻松更改列,所以如果最简单的解决方案是使用时间戳或其他东西,那么可以这样做。

<?php


include 'config.php';

$startd = ($_POST['startd']);
$endd = ($_POST['endd']);


$startd = mysqli_real_escape_string($con,$startd);
$endd = mysqli_real_escape_string($con,$endd);

$startd = '2014-11-18';
$endd = '2014-11-20';
$sql = "SELECT * FROM handover WHERE hdate >= date('" . $startd . "') AND hdate < 

ADDDATE(date('" . $endd . "'), INTERVAL 1 DAY)";
echo $sql; // run in mys

$result = mysqli_query($con,$sql);

$count=mysqli_num_rows($result);

if($count==0 ){

 echo "</br></br></br></br></br></br></br><p> No Matching results found</p>";
}
else{
while($row = mysqli_fetch_array($result)) {

我仍然只是得到一个“不匹配”的回声

【问题讨论】:

  • 检查你的语法:hdate AND &gt;= '" . $startd . "' AND &lt;' 应该是hdate &gt;= '" . $startd . "' AND hdate &lt;'

标签: php mysql


【解决方案1】:

假设$startd$endd 的基本 MySQL 日期格式为 YYYY-MM-DD,那么:

$sql = "SELECT * FROM handover WHERE hdate >= date('" . $startd . "') AND hdate < ADDDATE(date('" . $endd . "'), INTERVAL 1 DAY)";

否则,您可能需要执行一些字符串操作以将$startd$endd 重新格式化为 YYYY-MM-DD,然后才能使用上述内容。

我对如何调试这些东西的建议是硬编码变量中的一些值并打印出 SQL,然后在控制台中运行它并对其进行处理,直到你可以让它按预期工作:

$startd = '2014-11-18';
$endd = '2014-11-20';
$sql = "SELECT * FROM handover WHERE hdate >= date('" . $startd . "') AND hdate < ADDDATE(date('" . $endd . "'), INTERVAL 1 DAY)";
echo $sql; // run in mysql console and see how it works before moving forward in php

然后在工作之后,升级到使用 POST 参数并打印 SQL,你会根据它是否匹配之前的工作来知道它是否正确。

请注意,您的 SQL 语法已在上面更正,因为您有两次 AND,而它只需要一次,并且您在第二次 AND 之后缺少对 hdate 的引用。

【讨论】:

  • 我正在使用 jquery datpicker 来设置日期,当我查看我的 hdate 列时,格式是正确的。日期输入正确。我就是不能把它们弄出来。我尝试在 >= 等之间使用,但无法让它们工作。你认为这可能与我使用的日期列有关。上述查询是否适用于列时间戳
  • @Fintan Creaven,首先,如上所示,您需要将 date() 包裹在字符串周围,因为在 MySQL 中,日期时间字段不仅仅是一个字符串。其次,从我编辑查询的方式可以看出,您的 AND 位置非常错误(并且缺少对 hdate 的引用)。
  • 我接受了您的查询并用它替换了我的查询,但没有成功
  • 嘿,我想我解决了这个问题,我有一个单独的时间戳列。在阅读了一些文档后,它说我只被允许使用一种类型的“邮票”。我删除了这个,您的查询正在运行。感谢您的宝贵时间。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-10-30
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多