SQL根据日期提取数据

时间:2016-05-05 22:25:51

标签: php html sql datetime

我有一个充满商店信息和个人交易的数据库。我有两个网页。一个用户输入商店名称并运行查询,提取该商店的所有交易信息。我有另一个页面几乎完全相同,它接受开始日期和结束日期的输入,然后运行查询该日期之间的事务。商店名称的一个完美,但日期的那个不显示任何东西。我还在学习html / php / sql,但我确切知道第一页是如何工作的,所以我不明白为什么同样不能用于第二页。如果有人可以帮助我,我会很感激。

这是我的第一个商店名称搜索页面。

<?php

$transaction = $_REQUEST["StoreName"];

    require_once 'login.php';

    $connection = mysqli_connect(
           $db_hostname, $db_username,
           $db_password, $db_database);



       $sql = "SELECT * FROM PURCHASE WHERE StoreName LIKE '%".$transaction."%'";
        $result = $connection->query($sql);

    ?>

    Purchases Made From <?php echo $transaction ?>
<table border="2" style="width:100%">
    <tr>
                  <th width="15%">Item Name</th>
                  <th width="15%">Item Price</th> 
                  <th width="15%">Purchase Time</th>
                  <th width="15%">Purchase Date</th>
                  <th width="15%">Category</th>
                  <th width="15%">Rating</th>
                </tr>
</table>
     <?php
        if($result->num_rows > 0){
            // output data of each row
            while($rows = $result->fetch_assoc()){ ?>
               <table border="2" style="width:100%">
                <tr>
                    <td width="15%"><?php echo $rows['ItemName']; ?></td>
                    <td width="15%"><?php echo $rows['ItemPrice']; ?></td>
                    <td width="15%"><?php echo $rows['PurchaseTime']; ?></td>
                    <td width="15%"><?php echo $rows['PurchaseDate']; ?></td>
                    <td width="15%"><?php echo      $rows['PurchaseCategory']; ?></td>
                    <td width="15%"><?php echo $rows['Rating']; ?></td>
                </tr>
                <?php
            }
        }
        ?>

这是日期搜索的页面,不返回任何数据。

<?php

$startDate = $_REQUEST["StartDate"];
$endDate = $_REQUEST["EndDate"];

    require_once 'login.php';

    $connection = mysqli_connect(
           $db_hostname, $db_username,
           $db_password, $db_database);



       $sql = "SELECT * FROM PURCHASE WHERE PurchaseDate BETWEEN '%".$startDate."%' and '%".$endDate."%'";
        $result = $connection->query($sql);

    ?>

    Purchases Made Between <?php echo $startDate ?> and <?php echo $endDate ?>
<table border="2" style="width:100%">
    <tr>
                  <th width="15%">Item Name</th>
                  <th width="15%">Item Price</th> 
                  <th width="15%">Purchase Time</th>
                  <th width="15%">Purchase Date</th>
                  <th width="15%">Category</th>
                  <th width="15%">Rating</th>
                </tr>
</table>
     <?php
        if($result->num_rows > 0){
            // output data of each row
            while($rows = $result->fetch_assoc()){ ?>
               <table border="2" style="width:100%">
                <tr>
                    <td width="15%"><?php echo $rows['ItemName']; ?></td>
                    <td width="15%"><?php echo $rows['ItemPrice']; ?></td>
                    <td width="15%"><?php echo $rows['PurchaseTime']; ?></td>
                    <td width="15%"><?php echo $rows['PurchaseDate']; ?></td>
                    <td width="15%"><?php echo $rows['PurchaseCategory']; ?></td>
                    <td width="15%"><?php echo $rows['Rating']; ?></td>
                </tr>
                <?php
            }
        }
        ?>

显然,链接到这两个输出页面的初始搜索页面有所不同,但我可以确认日期输出页面正在从搜索页面接收正确的日期。

编辑:这是日期的搜索页面。

<!DOCTYPE html>
<html>
<head>
<title>Output 2</title>
</head>
<body>
<h1>Required Output 2</h1>
<h2>Transaction Search By Date</h2>
<br/>
<br/>

<form action="outputout2.php" method="get">
Start Date: <input type="date" name="StartDate">
End Date: <input type="date" name="EndDate">
<input name="Add Merchant" type="submit" value="Search">
</form>;

</body>
</html>

1 个答案:

答案 0 :(得分:1)

这类问题通常是错误格式化日期的结果。

您的查询,如果我正确读取它,当您在php中完成组装并将其发送到SQL服务器时说:

 SELECT *
   FROM PURCHASE                   --wrong!
  WHERE PurchaseDate BETWEEN '%5/1/2016%' and '%5/8/2016%'

这不起作用。

首先,%符号仅适用于LIKE运算符,而不适用于相等和不等运算符。

另一方面,数据库服务器软件的不同品牌和型号使用不同格式的日期字符串。 MySQL和SQL Server可以使用2016-05-01等字符串格式正常工作。但是,您必须为您正在使用的SQL软件产品查找适当的方法。这种东西不是供应商可移植的。

第三:您的表中的PurchaseDate列需要具有类似日期的数据类型才能使用此类事物。

第四:如果您的PurchaseDate项是时间戳 - 也就是说,如果它有日期和时间 - 则无法可靠地使用BETWEEN运算符。原因如下:假设您的值为2016-05-08 11:50:00当您将其与结束日期2016-05-08进行比较时,它会超出结束日期。所以,你真正需要的是:

 WHERE PurchaseDate >= '2016-05-01'
   AND PurchaseDate <  '2016-05-09' -- the day AFTER your end date

该构造与BETWEEN的执行方式相同,并且不会搞砸最后几天的数据。

编辑所以这是你正在使用的MySQL。

Workbench是一个客户端程序。 PHP也是如此。服务器是MySQL。当您执行类似

的操作时
     DateColumn < 'string constant'

MySQL隐式地将string constant转换为日期。如果字符串常量的格式足够接近ISO 8601,服务器可以找出它的含义,它将转换它。 2016-12-13完全正确。 2016-5-31足够接近MySQL,2016-5-5也是如此。 2016/12/31不起作用。 5/5/16也没有。

Germane对你的问题是:MySQL无法将%2016-5-5%(百分号)转换为日期。

当MySQL无法转换日期时,它会出现NULL。 Comparisons with NULL values are weird。并且,在Hunter S. Thompson的不朽言辞中,"when the going gets weird, the weird turn pro"。 NULL怪异可能是您显示的查询中空结果集的根本原因。