0

MSSQL 2008 r2 の SQLSRV で PHP を使用しています。

私ができるようにしたいのは、2つの日付を2つの入力ボックスに入力し、注文の合計数と合計値の例とともに、目的の日付間のレコードのみを表示することです:

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

1 に答える 1

1

この質問に反対票が投じられる理由がわかりません。そのページは、Claudia が尋ねている質問に完全には答えていません。さらに、特にユーザーが時間を気にせず、日付だけを気にする場合は、その答えが予期しない結果につながる可能性があります。時刻が指定されていない場合、SQL の datetime はデフォルトで "< date > 00:00:00.000" になります (日付の丸めは 1000 分の 1 秒の範囲で不安定になります)。したがって、<= 5/29/2013 は、5 月 29 日の午前 0 時以降のすべてを除外します (技術的には、2013 年 5 月 29 日 00:00:00.001 以降に発生したすべて)。>= 2013 年 5 月 24 日は、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 では、渡した特定の CustomerID の TotalOrderValue を返すことができます。2 番目の SELECT では、すべての CustomerID に対して返されます。

繰り返しますが、このソリューションは、高度な日付精度が必要な場合には完全ではありません。これは、時間枠のミリ秒単位で発生した注文を引き続き取得するためです。日付と時刻の個々の部分を確認するには、クエリを少し変更する必要があります。最善の解決策は、フロントエンドで日付を保存する方法に注意することだと思います。日時の精度をどの程度気にするかを早い段階で決定し、挿入/更新するときに書式を設定します。精度が必要ない場合は、smalldatetime に切り替えてください。それは秒を完全に取り除きます。また、使用するデータ ストレージも少なくなります。

SQL の日付は簡単に面倒な作業になる可能性があります。クエリで実際に何が返されているのかを知る必要があります。

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

日付の丸め: http://sqlfiddle.com/#!3/d41d8/14821/0

于 2013-06-01T14:59:25.693 に答える