2012-08-13 69 views
1

正确检索的开始和结束时间查询我有我找回两个给定的时间跨度之间每小时一班基于CTE的查询。我的查询工作如下:在PostgreSQL的查询

获取开始和结束日期时间(比如说07-13-2011 00:21:09和07-31-31 21:11:21) 获取每小时的小时总查询值每天的时间间隔(在这里是从00到21,总共21小时,但这是参数化的,取决于我给出的输入的小时数)。此查询运行良好,但存在问题。它显示每小时金额但开始的时候,它得到所有00:00:00和○点59分59秒之间的查询每一天,而不是0时21分09秒 - ○点59分59秒和同样适用于结束时间它会在每天21:00:00和22:00:00之间获取所有查询,而不是21:00:00和21:11:21。 - 顺便说一句,其他小时间隔,例如03:00 - 04:00等目前正常恢复,没有提供分钟和秒钟,只有1小时的平坦时间间隔 - 我该如何解决这个问题?查询如下,谢谢。

WITH cal AS (
    SELECT generate_series('2011-02-02 00:00:00'::timestamp , '2012-04-01 05:00:00'::timestamp , '1 hour'::interval) AS stamp 
     ) 
, qqq AS (
     SELECT date_trunc('hour', calltime) AS stamp 
     , count(*) AS zcount 
     FROM mytable 
    WHERE calltime >= '07-13-2011 00:21:09' AND calltime <='07-31-2011 21:11:21' AND date_part('hour', calltime) >= 0 AND date_part('hour', calltime) <= 21 
     GROUP BY date_trunc('hour', calltime) 
     ) 
SELECT cal.stamp 
     , COALESCE (qqq.zcount, 0) AS zcount 
FROM cal 
LEFT JOIN qqq ON cal.stamp = qqq.stamp 
WHERE cal.stamp >= '07-13-2011 00:00:00' AND cal.stamp<='07-31-2011 21:11:21' AND date_part('hour', cal.stamp) >= 0 AND date_part('hour', cal.stamp) <= 21 
ORDER BY stamp ASC; 

编辑:

我的意思是我的问题是,尽管在第一天给予0点21分09秒对我的出发小时,这一天以后的日子里计算总查询次数,在第一个小时间隔为00间总查询计数:00:00-01:00改为00:00 21:09-01:00:00(顺便说这应该适用于第一个小时的时间间隔为每一天,我可以给4时30分21秒的启动时间和一天开始计时总查询每小时开始从那里等 - 同样适用于结束时间21:00:00-21:11:21,只有最后一天的查询结果需要这个时间间隔,在查询计数在21和22之间的前几天,通过计算21:0之间的所有查询0:00-22:00:00而不是21:00:00-21:11:21。

例如,如果有00:00:00和01:00:00之间200个查询7月14日2011(第二天7月13日,在开始日期之后),但也有0点21之间的查询159: 09 - 01:00:00,我应该得到159个查询,而不是200个。此外,如果在任意一天的21:00到00:00:00之间有300个查询,并且其中的123个查询在21:00之间:00-21:11:21,我应该得到123结果而不是300结果。(这适用于每一天,其他每小时的间隔应该像往常一样计算,如01:00-02:00,20:00- 21:00等,这是参数,每隔一小时,并开始,结束时间取决于用户输入 -

+0

的问题是很难理解,你可以检查语法,并提供一些例子(期望的结果,实际结果) – leonbloy 2012-08-14 18:07:11

+0

@leonbloy增加了一个小的描述到底是编辑,让我知道,如果它仍然不清楚。 – sm90901 2012-08-14 22:04:10

+0

@leonbloy解决了它,将它作为答案发布 – sm90901 2012-08-14 23:54:13

回答

1

添加AND calltime::time >= '00:21:09' AND calltime::time <= '21:11:21'WHERE calltime >= '07-13-2011 00:21:09' AND calltime <='07-31-2011 21:11:21'块解决的问题。