查看DATEDIFF 进行时间计算。您的要求不是很明确,但它应该适用于您想要做的任何事情。
您的最终结果可能如下所示:
SELECT
userid,
game,
DATEDIFF(SS, gameStarttime, gameEndtime) AS [TotalSeconds]
FROM [source]
GROUP BY
userid,
game
在上面的示例查询中,SS 计算两个日期之间的秒数(假设两者都不为空)。如果您只需要几分钟,那么MI 将提供总分钟数。但是,我认为总秒数最好,这样您就可以转换为您需要准确的任何度量单位,例如可能是“1.23”或类似的小时数。
同样,这大部分是基于假设和您似乎在寻找的东西的推测。希望对您有所帮助。
DATEDIFF 的 MSDN 文档:https://msdn.microsoft.com/en-us/library/ms189794.aspx
如果你想分开分和秒,你也可以查找 DATEPART。
根据反馈更新
以下查询按天细分小时数,将时间拆分为多天,并在没有玩游戏的天数显示“0”。此外,对于您的输出,我必须假设您有一个单独的用户表(这样您就可以显示在您的日期范围内没有时间的用户)。
-- Define start date
DECLARE @BeginDate DATE = '4/21/2015'
-- Create sample data
DECLARE @Usage TABLE (
userid int,
game nvarchar(50),
gameStartTime datetime,
gameEndTime datetime
)
DECLARE @Users TABLE (
userid int
)
INSERT @Users VALUES (1)
INSERT @Usage VALUES
(1, 'sample', '4/25/2015 10pm', '4/26/2015 2:30am'),
(1, 'sample', '4/22/2015 4pm', '4/22/2015 4:30pm')
-- Generate list of days in range
DECLARE @DayCount INT = DATEDIFF(DD, @BeginDate, GETDATE()) + 1
;WITH CTE AS (
SELECT TOP (225) [object_id] FROM sys.all_objects
), [Days] AS (
SELECT TOP (@DayCount)
DATEADD(DD, ROW_NUMBER() OVER (ORDER BY x.[object_id]) - 1, @BeginDate) AS [Day]
FROM CTE x
CROSS JOIN CTE y
ORDER BY
[Day]
)
SELECT
[Days].[Day],
Users.userid,
SUM(COALESCE(CONVERT(MONEY, DATEDIFF(SS, CASE WHEN CONVERT(DATE, Usage.gameStartTime) < [Day] THEN [Day] ELSE Usage.gameStartTime END,
CASE WHEN CONVERT(DATE, Usage.gameEndTime) > [Day] THEN DATEADD(DD, 1, [Days].[Day]) ELSE Usage.gameEndTime END)) / 3600, 0)) AS [Hours]
FROM [Days]
CROSS JOIN @Users Users
LEFT OUTER JOIN @Usage Usage
ON Usage.userid = Users.userid
AND [Days].[Day] BETWEEN CONVERT(DATE, Usage.gameStartTime) AND CONVERT(DATE, Usage.gameEndTime)
GROUP BY
[Days].[Day],
Users.userid
上面的查询产生下面的示例数据输出:
Day userid Hours
---------- ----------- ---------------------
2015-04-21 1 0.00
2015-04-22 1 0.50
2015-04-23 1 0.00
2015-04-24 1 0.00
2015-04-25 1 2.00
2015-04-26 1 2.50
2015-04-27 1 0.00