簡體   English   中英

SQLSRV:如何在兩個日期之間進行搜索並獲取所有記錄

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

我正在將PHP與SQLSRV一起用於MSSQL 2008 r2。

我想要做的是在兩個輸入框中輸入兩個日期,並僅顯示所需日期之間的記錄,其中包括訂單總數和總價值示例:

我想顯示在2013年5月24日至2013年5月29日之間下了多少個訂單,因此我將沿着放置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

** * ** * *** 編輯 * ** * ** * ** * ** * ****

好的,感謝肖恩,我有一個起點。 我已將他的查詢放入以下演示腳本中,但是未執行,我在哪里出錯?

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: ";
?>

我不明白為什么這個問題得到了反對。 該頁面並不能完全回答Claudia提出的問題。 加上給出的答案可能會導致一些出乎意料的結果,特別是如果用戶不在乎時間,只在乎日期。 如果未指定時間,則SQL日期時間默認為“ <date> 00:00:00.000”(日期舍入會在千分之一秒的范圍內發生變化)。 因此<= 5/29/2013將排除午夜之后的5月29日(從技術上講,是5/29/2013 00:00:00.001之后發生的所有事件)。 並且> = 5/24/2013會提取2013年5月23日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

第一個SELECT將允許您為傳入的特定客戶ID返回TotalOrderValue。第二個SELECT將為所有客戶ID返回。

同樣,如果您需要高度的日期精度,則此解決方案也不完美,因為您仍然可以拾取在時間范圍的毫秒范圍內發生的訂單。 您必須稍微修改一下查詢來檢查日期和時間的各個部分。 我認為最好的解決方案是小心在前端存儲日期。 盡早確定您對日期時間的精度有多大的關注,並在插入/更新日期格式時對其進行格式化。 如果不需要精度,請切換到較小的日期時間。 完全擺脫了秒。 而且它使用更少的數據存儲。

SQL中的日期很容易讓人感到痛苦。 您只需要知道查詢返回的內容是什么。

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

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM