繁体   English   中英

使用分组依据的SQL Server GMT日期和时间转换每小时报告

[英]SQL Server GMT date & time conversion hourly report using group by

几天来,我一直在努力解决这个问题,并希望就如何正确处理此问题提供一些反馈或建议。

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

问题是付款记录是根据服务器的日期/时间(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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM