两个日期/时间之间的特定一小时时段的数量

时间:2014-05-30 13:48:27

标签: sql date

我有一张桌子记录表,称之为"游戏"

它有一个id和时间戳。

我需要知道的与具体表格无关。为了知道每小时平均玩的游戏数量,我需要知道:

  • 在日期范围内每小时播放的游戏总数
  • 每小时数 日期范围之间的时段。

找到第一个是从时间戳中提取小时并按其分组的问题。 对于第二种情况,如果将日期范围四舍五入到最近的一天,则查找此值将很容易(totalgames / numdays)。

不幸的是我无法承担这一点。我需要帮助的是找到一个时间范围内存在的特定小时数。

实施例: 如果范围是今天下午5点到明天晚上8点,那么有一个" 00"小时(午夜到凌晨1点),但两个 17,18,19小时(5-6,6-7,7-8)

感谢您的帮助

编辑:为清楚起见,请考虑以下查询:

我有桌面游戏:

id,daytime

select EXTRACT(hour from daytime) as hour_period, count (*)
from game
where daytime > dateFrom and daytime < dayTo
group by hour_period

这将为我提供在该时间段内分解为每小时块的游戏数量。

为了找到每小时播放的平均游戏数量,我需要确切知道两个时间戳之间有多少特定小时的持续时间。简单地除以天数就不准确了。

编辑:理想的输出看起来像这样:

00   275
01   300
02   255
...

请考虑以下事项:在日期1和日期2之间发生午夜多少次?如果你有1.5天,那并不能保证午夜会发生两次。例如,明天上午6点到明天晚上6点,已经是午夜1点,但是今晚9点到早上9点,从现在开始的两天有2个午夜。

我想要找到的是在两个时间戳之间发生了多少精确小时,所以我可以用它来平均一段时间内玩这个游戏的次数。

3 个答案:

答案 0 :(得分:1)

修改

以下查询获取游戏的天数,小时数和数量,输出如下:

29 23 100
29 00 130
30 22 140
30 23 150

然后,外部查询将每个不同小时的游戏数加起来并除以小时数,如下所示

22 140
23 125
00 130

修改后的查询如下:

SELECT 
hour_period,
sum(hourly_no_of_games) / count(hour_period)
FROM
(
SELECT
EXTRACT(DAY from daytime) as day_period,
EXTRACT(HOUR from daytime) as hour_period, 
count (*) hourly_no_of_games
from game
where daytime > dateFrom and daytime < dayTo
group by EXTRACT(DAY from daytime), EXTRACT(HOUR from daytime)
) hourly_data
GROUP BY hour_period
ORDER BY hour_period;

SQL Fiddle demo

答案 1 :(得分:0)

如果您需要GROUP BY的内容,可以将时间戳截断为小时级别,如下所示:

DECLARE @Date DATETIME
SET @Date = GETDATE()

SELECT @Date, DATEADD(Hour, DATEDIFF(Hour, 0, @Date), 0) AS RoundedDate

如果您只需要查找总小时数,则可以在几小时内选择DATEDIFF,例如

SELECT DATEDIFF(Hour, '5/29/2014 20:01:32.999', GETDATE())

答案 2 :(得分:0)

不仅提取一天中的小时,而且提取一年中的一天(1-366)。然后分组。如果间隔可能跨越一年,那么将年份本身和组分别加上三个。

year  dy hr games
2013 365 23 115
2014   1 00 103