0

几天来,我一直在努力解决这个问题,并且希望得到一些关于如何正确处理这个问题的反馈或建议。

我正在尝试创建一个每小时运行的 SQL 查询,该查询选择前一小时的所有记录并将它们插入到新的报告表中。我当前的 SQL 查询按预期工作;但我现在需要找出如何调整CreationHourCreationDate根据客户的 GMT 设置

问题是付款记录是根据服务器日期/时间(即 GMT -5 和数据类型datetime)插入的,所以我需要根据客户 GMT 以某种方式调整时间,然后添加或减去 -5 GMT服务器。

到目前为止,我唯一能想到的是使用 CASE 语句,但问题是我需要使用相同的 CASE 语句 5 次,这将有 73 个可能的 WHEN 语句。

任何人都可以就如何解决此问题或解决此问题提出更好的选择吗?到目前为止,上周我遇到了 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 通过删除报告的小时数的计算得到了简化,即我假设您想要报告日期时间的 @t1 到 @t2(本地服务器时间)之间的付款。CreationHour 和 CreationDate 是 P.CreationDateTime 通过添加 5 小时(以获取 GMT 时间)然后添加客户时区相对于 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 回答