0

我有一个大约 3000 行的列表。每行都有不同的结束时间。见下文

Fund name | Fund ID   | RedeemTime  | PurchaseTime | LatestTime  |
__________  _________  ____________   ____________ | ___________ |
Title1    | IDnumber  |  4:00:00    | 14:30:00     |  14:30:00   |
Title2    | IDnumber2 | 13:30:00    | 12:00:00     |  13:30:00   |
Title3    | IDnumber3 | 10:00:00    | 14:00:00     |  14:00:00   |
Title4    | IDnumber4 | 10:00:00    | 10:30:00     |  10:30:00   |

我目前正在使用第 5 列的 case 语句来查找两次中的后者。

我需要使用第 5 列并提供每小时发生的情况的计数。例如,在上面的表格中,结果将是

Hour     |  Count
_________ _______
10:00:00 |    1
13:00:00 |    1
14:00:00 |    2
4

2 回答 2

3

您可以在子查询中“标准化”两次。您可以使用 CTE 生成小时列表。例如,对于 2012 年 8 月的所有时间:

; with  HourList as
        (
        select  cast('2012-08-01' as datetime) as DateCol
        union all
        select  dateadd(hour, 1, DateCol)
        from    HourList
        where   dateadd(hour, 1, DateCol) < '2012-09-01'
        )
select  hr.DateCol
,       count(yt.StartTime)
from    HourList hr
left join
        (
        select  case when time1 > time2 then time1 else time2 end as EndTime
        from    YourTable
        ) yt
on      yt.EndTime <= hr.DateCol and hr.DateCol < dateadd(hour, 1, yt.EndTime)
group by
        hr.DateCol
option  (maxrecursion 0)

如果您没有一个填满小时的表格,有办法生成它。它们都取决于您的数据库。因此,如果您需要帮助,请发布您正在使用的数据库。

于 2012-08-21T18:09:23.773 回答
1

假设您仅使用时间字段...

首先,选择哪个时间更大:

(CASE WHEN time2 > time1 THEN time2
ELSE time1) as time

然后你SELECTCOUNTGROUP BY HOUR(time)

于 2012-08-21T18:03:10.603 回答