SQLSRV:如何在两个日期之间搜索并获得所有记录


SQLSRV: How to search between two dates and get all records

我使用PHP与SQLSRV的MSSQL 2008 r2。

我想要能够做的是,在两个输入框中输入两个日期,并仅显示所需日期之间的记录,订单总数和总价值示例:

我想显示在24/05/13和29/05/13之间下了多少订单,所以我将得到2个订单的输出,总价值= 50。

也许这比我想的要简单。我是PHP和SQLSRV的新手。实现这一点的最佳方式是什么?

**Orders Table** 
OrderId CustomerID OrderDate   OrderValue 
1        1         2013-05-29  23.00
2        2         2013-05-26  23.00
3        2         2013-05-26  27.00
4        3         2013-05-24  23.00

* * * * * * * * * 编辑 * * * * * * * * * * * * * * * * *

好吧,多亏了Shawn,我有了一个起点。我把他的查询到下面的演示脚本,但它没有执行,我在哪里出错?

Form.php

<form action="action.php" method="post" >
  <input name="StartDate" type="text"  id="StartDate" value="start"/>
  <input name="StartDate" type="text"  id="EndDate" value="end"/>
  <input type="submit" name="submit" >
  </form>

Action.php返回SQL计算

<?php
include("connect.php");
?>
<?php
DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @CustomerID int
SET @StartDate = '05/24/2013' /* FORM.StartDate */
SET @EndDate = '05/29/2013'   /* FORM.EndDate */
SET @CustomerID = 2           /* FORM.CustomerID */
/* Get the TotalOrderValue for All CustomerIDs */
$sql ="SELECT CustomerID, sum(OrderValue) AS TotalOrderValue
FROM Orders
WHERE OrderDate >= @StartDate
  AND OrderDate < dateAdd(d,1,@EndDate)
GROUP BY CustomerID
ORDER BY CustomerID";
$stmt = sqlsrv_query( $conn, $sql);
if( $stmt === false ) {
     die( print_r( sqlsrv_errors(), true));
}
$CustomerID = sqlsrv_get_field( $stmt, 0);
echo "$TotalOrderValue: ";
?>

我不明白为什么这个问题得到了否定。这一页并没有完全回答克劳迪娅的问题。另外,给定的答案可能会导致一些意想不到的结果,特别是如果用户不关心时间,只关心日期。如果没有指定时间,SQL的datetime默认为" 00:00:00.000"(日期四舍五入在千分之一秒范围内变得不稳定)。所以<= 5/29/2013将排除5月29日午夜之后的所有时间(技术上讲,在5/29/2013 00:00:00.001之后发生的所有事情)。并且>= 5/24/2013将拾取5/23/2013 23:59:59.998发生的订单。当你使用BETWEEN startDate和endDate(这是我个人讨厌的)时也是如此。

这完全取决于你想要/需要的精度水平。在大多数情况下,0.003秒没什么大不了的。如下所示:

DECLARE @StartDate datetime
DECLARE @EndDate datetime
DECLARE @CustomerID int
SET @StartDate = '05/24/2013' /* FORM.StartDate */
SET @EndDate = '05/29/2013'   /* FORM.EndDate */
SET @CustomerID = 2           /* FORM.CustomerID */
/* Get the TotalOrderValue for Specific CustomerID */
SELECT sum(OrderValue) AS TotalOrderValue
FROM Orders
WHERE CustomerID = @CustomerID
  AND OrderDate >= @StartDate
  AND OrderDate < dateAdd(d,1,@EndDate)
/* Get the TotalOrderValue for All CustomerIDs */
SELECT CustomerID, sum(OrderValue) AS TotalOrderValue
FROM Orders
WHERE OrderDate >= @StartDate
  AND OrderDate < dateAdd(d,1,@EndDate)
GROUP BY CustomerID
ORDER BY CustomerID

First SELECT将允许您返回您传入的特定CustomerID的TotalOrderValue。第二个SELECT将返回所有customerid。

同样,如果您需要高度的日期精度,这个解决方案并不完美,因为您仍然需要在时间框架的毫秒边缘拾取发生的订单。您必须稍微更改一下查询,以检查日期和时间的各个片段。我认为最好的解决方案是在前端存储日期时要小心。尽早决定您有多关心日期时间的精度,并在插入/更新日期时间时对其进行格式化。如果您不需要精度,请切换为smalldatetime。这样就把秒都去掉了。而且它使用更少的数据存储。

SQL中的

日期很容易让人头疼。你只需要知道你在查询中返回的是什么。

http://sqlfiddle.com/!3/0947e/9/0http://sqlfiddle.com/!3/0947e/6

日期四舍五入:http://sqlfiddle.com/#!3/d41d8/14821/0