[英]SQL Server GMT date & time conversion hourly report using group by
几天来,我一直在努力解决这个问题,并希望就如何正确处理此问题提供一些反馈或建议。
我正在尝试创建一个每小时运行一次的SQL查询,该查询选择前一个小时的所有记录并将它们插入新的报告表中。 我当前的SQL查询按预期工作; 但是我现在需要找出如何根据客户GMT设置来调整CreationHour
和CreationDate
方法。
问题是付款记录是根据服务器的日期/时间(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
通过删除报告小时的计算,简化了下面的SQL,即我假设您要报告日期时间@ t1到@ t2(本地服务器时间)之间的付款情况。 通过添加5小时(以获取格林尼治标准时间),然后添加相对于GMT的客户时区偏移量,将CreationHour和CreationDate的P.CreationDateTime调整为客户时区。
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)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.