0

私はこの問題について何日も頭を悩ませてきました。この問題を適切に処理する方法について、フィードバックや提案をお待ちしています.

前の 1 時間のすべてのレコードを選択して新しいレポート テーブルに挿入する、1 時間ごとに実行される SQL クエリを作成しようとしています。現在の SQL クエリは意図したとおりに機能します。CreationHourしかし、顧客の GMT 設定にCreationDate基づいてを調整する方法を見つける必要があります。

問題は、支払いレコードがサーバーの日付/時刻 (GMT -5 およびデータ型datetime) に基づいて挿入されるため、顧客の GMT に基づいて時間を調整し、-5 GMT を加算または減算する必要があることです。サーバ。

これまでのところ、私が考えることができる唯一のことは CASE ステートメントを使用することですが、これの問題は、同じ CASE ステートメントを 5 回使用する必要があることです。これには、73 の可能な WHEN ステートメントがあります。

これにアプローチする方法またはこの問題を解決する方法について、より良いオプションを提案できる人はいますか? これまでの 1 週間で、私は 3 つの行き止まりに遭遇しましたが、これに近づくためのより最適な方法を見つけることができません。

私が実行している現在のSQLクエリは次のとおりです。

SELECT 
   P.ComputerID, P.CustomerID, MAX(C.GMT) AS TimeAdguest,
   MAX(DATEPART(HOUR, dateadd(hour, (C.GMT -1), P.CreationDateTime))) AS [CreationHour], 
   Convert(varchar(10),MAX(dateadd(hour, (C.GMT -1),P.CreationDateTime)),101) AS [CreationDate],
   SUM(P.SecondsPurchased) AS [Seconds],
   SUM(P.PagesPurchased) AS [Pages], 
   SUM(P.Amount) AS [Amount]
FROM [Payments] P
left Join Customer C ON C.CustomerID = P.CustomerID
WHERE 
    DATEPART(HOUR, P.CreationDateTime) = DATEPART(HOUR, dateadd(hour,-1, getdate()))
    AND Convert(varchar(10), dateadd(hour, -1, P.CreationDateTime), 101) = Convert(varchar(10), dateadd(hour, -1, getdate()), 101)
GROUP BY 
    Convert(varchar(10),P.CreationDateTime,101), P.ComputerID, P.CustomerID

そして、次の結果を返します。

ComputerID  CustomerID  TimeAdguest CreationHour    CreationDate    Seconds Pages   Amount
-------------------------------------------------------------------------------------------
 7679   1188    -2  8   03/27/2013  1670    0   56.9600009918213
12891   42  17  3   03/28/2013  740 0   26.7200005054474
12893   42  17  3   03/28/2013  480 0   20.1400001049042
12894   42  17  3   03/28/2013  280 0   10.8799998760223
12943   42  17  3   03/28/2013  120 0   1
12943   1188    -2  8   03/27/2013  240 0   2
13407   1188    -2  8   03/27/2013  960 0   40.2800002098084
13476   1188    -2  8   03/27/2013  840 0   25.6999996900558
14281   42  17  3   03/28/2013  562 0   6
16026   1188    -2  8   03/27/2013  1134    0   13
4

1 に答える 1

0

以下の SQL は、レポートされる時間の計算を削除することで簡略化されています。つまり、datetime の @t1 から @t2 (ローカル サーバー時間) の間の支払いについてレポートしたいと仮定しました。CreationHour と CreationDate は P.CreationDateTime であり、(GMT で時間を取得するために) 5 時間を追加し、GMT に対する顧客のタイムゾーンのオフセットを追加することで、顧客のタイムゾーンに調整されます。

SELECT P.ComputerID, P.CustomerID,
HOUR(DATEADD(HOUR, 5 + C.GMT, P.CreationDateTime)) AS [CreationHour],
CONVERT(VARCHAR(10),DATEADD(HOUR, 5 + C.GMT, P.CreationDateTime),101) AS [CreationDate],
SUM(P.SecondsPurchased) AS [Seconds],
SUM(P.PagesPurchased) AS [Pages], 
SUM(P.Amount) AS [Amount]
FROM [Payments] P
INNER JOIN Customer C ON C.CustomerID = P.CustomerID
WHERE P.CreationDateTime BETWEEN @t1 AND @t2
GROUP BY P.ComputerID, P.CustomerID,
HOUR(DATEADD(HOUR, 5 + C.GMT, P.CreationDateTime))
CONVERT(VARCHAR(10),DATEADD(HOUR, 5 + C.GMT, P.CreationDateTime),101)
于 2013-03-27T21:44:54.847 に答える