1

我有一个基于 CTE 的查询,我在其中检索两个给定时间跨度之间的每小时间隔。我的查询工作如下:

获取开始和结束日期时间(比如说 07-13-2011 00:21:09 和 07-31-2011 21:11:21)获取每小时间隔之间的每小时总查询值(这里是从 00 到 21,a总共 21 小时,但这是参数化的,取决于我每天输入的时间)。此查询运行良好,但存在问题。它显示每小时的金额,但对于开始时间,它获取每天 00:00:00 和 00:59:59 之间的所有查询,而不是 00:21:09 - 00: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;

编辑:

我的问题是,尽管我在第一天的开始时间为 00:21:09,但那天之后的几天计算第一小时间隔的总查询计数作为 00:00:00 之间的总查询计数 - 01:00:00 而不是 00:21:09-01:00:00。(顺便说一下,这应该适用于每天的第一个小时间隔,我可以给开始时间和当天的 04:30:21将从那里开始每小时计算总查询数等-同样适用于结束时间 21:00:00-21:11:21,只有查询结果中的最后一天采用此间隔,其他天采用查询前通过计算 21:00:00-22:00:00 而不是 21:00:00-21:11:21 之间的所有查询来计算 21 和 22 小时之间的时间。

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

4

1 回答 1

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'块解决了这个问题。

于 2012-08-14T23:54:42.787 回答