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