如何计算不同时间段数据库中的行数?
我已经在Sybase DB中创建了一个具有列createdDateTime的表。 我想要做的是计算在特定但累积的时间段之间创建了多少行,即:
7:00 - 7:15
7:00 - 7:30
7:00 - 7 :45
7:00 - 8:00 ... 等等,直到我有最后一次组,7:00 - 18:00。
如何计算不同时间段数据库中的行数?
有没有一个很好的办法,使在SQL一个查询,将返回所有的行,我所有的行数:
时间 行创建
7:00 - 7:15 7:00 - 7:30 7:00 - 7:45 7:00 - 8:00 ... ...
我目前有一个解决方案,但它需要我运行参数化查询44次才能获取所有数据。
感谢,
我最近在博客这个确切的话题,不知道这是否在Sybase工作虽然,这里的解决方案
declare @interval int
set @interval = 5
select datepart(hh, DateTimeColumn)
, datepart(mi, DateTimeColumn)/@interval*@interval
, count(*)
from thetable
group by datepart(hh, DateTimeColumn)
, datepart(mi, DateTimeColumn)/@interval*@interval
和更多的细节 http://ebersys.blogspot.com/2010/12/sql-group-datetime-by-arbitrary-time.html
试试这个
select count(*) from table groupedby createdDateTime where createdDateTime in (
SELECT *
FROM table
WHERE createdDateTime between createdDateTime ('2011/01/01:07:00', 'yyyy/mm/dd:hh:mm')
AND createdDateTime ('2011/01/01:07:15', 'yyyy/mm/dd:hh:mm')
)
这不会聚集的时间段,以及只有在时间段精确的情况下,group by才会起作用。 – Dhiren 2011-04-15 13:54:38
确实的Sybase有CASE
声明?如果是这样试试这个:
SELECT SUM(CASE WHEN CreatedTime BETWEEN ('7:00:00' AND '7:14:59') THEN 1 ELSE 0) as '7-7:15',
SUM(CASE WHEN CreatedTime BETWEEN ('7:15:00' AND '7:29:59') THEN 1 ELSE 0) as '7:15-7:30',
FROM MyTable
Where <conditions>
我在SQL Server中使用这个很多。
您可以确定创建行的小时的季度,并按该值进行分组。请注意,这是Oracle SQL,但Sybase可能具有相同的功能。
select to_char(datetime_created, 'HH24') hour
, floor(to_char(datetime_created, 'MI')/15)+1 quarter
, count(1)
from my_table
group by to_char(datetime_created, 'HH24')
, floor(to_char(datetime_created, 'MI')/15)+1;
你有不规则的时间段(有些是15分钟的长度,其他的是1小时的长度,其他的是几个小时的长度)。在这种情况下,你能做的最好的运行与case语句的查询:
with thetable as
(
SELECT 'TM' code, convert(datetime, '2011-04-15 07:01:00 AM') date, 1 id union all
SELECT 'TM', convert(datetime, '2011-04-15 07:05:00 AM'), 2 union all
SELECT 'TM', convert(datetime, '2011-04-15 07:08:00 AM'), 3 union all
SELECT 'TM', convert(datetime, '2011-04-15 07:20:00 AM'), 4 union all
SELECT 'TM', convert(datetime, '2011-04-15 08:25:00 AM'), 5
)
SELECT '07:00 - 07:15' interval, sum(case when CONVERT(varchar, date, 108) between '07:00:00' AND '07:14:59' then 1 else 0 end) counting
FROM thetable
union
select '07:15 - 08:00', sum(case when CONVERT(varchar, date, 108) between '07:15:00' AND '07:59:59' then 1 else 0 end)
from thetable
union
select '08:00 - 09:00', sum(case when CONVERT(varchar, date, 108) between '07:59:59' AND '08:59:59' then 1 else 0 end)
from thetable
现在,如果你确实有定期,你会做这样的事情:
select counting,
dateadd(ms,500-((datepart(ms,interval)+500)%1000),interval) intini
from
(
SELECT COUNT(1) counting, CONVERT(datetime, round(floor(CONVERT(float, date) * 24 * 4)/(24 * 4), 11)) interval
FROM
(
SELECT 'TM' code, convert(datetime, '2011-04-15 07:01:00 AM') date, 1 id union all
SELECT 'TM', convert(datetime, '2011-04-15 07:05:00 AM'), 2 union all
SELECT 'TM', convert(datetime, '2011-04-15 07:08:00 AM'), 3 union all
SELECT 'TM', convert(datetime, '2011-04-15 07:20:00 AM'), 4 union all
SELECT 'TM', convert(datetime, '2011-04-15 08:25:00 AM'), 5
) thetable
group by FLOOR(CONVERT(float, date) * 24 * 4)
) thetable2
注意24 * 4是15分钟的时间间隔。如果你的间隔时间是1小时,你应该用24代替。如果你的间隔时间是10分钟,那应该是24 * 6。我认为你得到了这张照片。
顺便说一句,我不知道那会转化为sybase,我使用SQL Server – 2011-04-15 14:13:37
这是不是多余的: datepart(mi,DateTimeColumn)/ @interval * @interval 如果按区间划分,然后按时间划分,那么您实际上留下的是开头的东西吗? – Dhiren 2011-04-15 14:48:53
@DHiren :如果它是整数除法,并且小数被截断;本质上它变成了一个周期性的Floor()函数,你不会提到哪个Sybase数据库,但是在ASE SELECT 7/5 * 5中返回5,因为7/5部分被截断为1,因为它被转换为整数。 – Terry 2011-04-15 16:11:37
@Terry:这几乎是我所需要的,除非它不产生滚动的总和,但我可以在代码后面做到这一点,谢谢! – Dhiren 2011-04-15 16:34:55