如何按日期和特定时间对数据进行分组

时间:2013-01-18 16:09:53

标签: sql sql-server tsql

我有桌子:

select Name, TimeStamp from Goods

我想按照日期从晚上9点到晚上9点对商品进行分组 所以结果应该是这样的:

Closes, Count, 2013-01-18 9PM 
Bikes, Count, 2013-01-18 9PM

怎么做?

我希望在24小时内收到数据,但每个时段从晚上9点开始,到第二天晚上9点结束,但不仅仅是1天,我的意思是结果可能是这样的:2013-01-17 9PM 3记录,2013-01-18 9PM 5记录。这意味着从1月17日晚上9点到晚上9点,我们卖出了3件商品。如果信息应该更加详细,请告诉我。

另一种描述:

enter image description here

结果应该是这样的:

Jamper1, 2013-01-17 21:00, 1
Jamper2, 2013-01-17 21:00, 1
Jamper1, 2013-01-18 21:00, 2
Jamper2, 2013-01-18 21:00, 2

3 个答案:

答案 0 :(得分:0)

这很接近,假设时间戳存储为datetime

select name, count(*), min(timestamp)
from goods
group by cast((timestamp + 3.0/24) as date)

它为时间戳添加了三个小时以进行分组。第三列是数据中的最小时间戳。

如果您想要更多格式的内容。 。

select name, count(*), cast(cast(timestamp + 3.0/24 as date) as datetime) + 21.0/24

这将在晚上9点给你一个问题。

答案 1 :(得分:0)

假设您想在12小时内显示“名称”的总数。虽然如果你已经知道你的时间段是上午9点到晚上9点,你为什么要显示时间?

select name, sum(name) as total, date_format(timestamp, '%Y-%m-%d %l%p') as time
from goods where hour(timestamp) between 9 and 21
group by name

如果这不是您想要的,请在示例表中更具体,以便我们为您提供帮助。

答案 2 :(得分:0)

最终我发现了如何做到这一点:

select Name, count(*), DATEADD(DD, 0, DATEDIFF(DD, 0, dateadd(hour, 3, [TimeStamp])))
from Goods
group by Name, DATEADD(DD, 0, DATEDIFF(DD, 0, dateadd(hour, 3, [TimeStamp])))

希望它对你也有帮助。