【问题标题】:Retrieving the start and end hour queries correctly in PostgreSQL Query在 PostgreSQL 查询中正确检索开始和结束时间查询
【发布时间】:2012-08-13 22:48:54
【问题描述】:

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

获取开始和结束日期时间(比如 07-13-2011 00:21:09 和 07-31-2011 21:11:21) 获取每天每小时间隔之间的每小时总查询值(这里是从 00 到 21,总共 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 之间有 159 个查询- 01: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 等。这是参数,每小时间隔和开始结束时间取决于用户输入 -

【问题讨论】:

  • 这个问题很难理解,能否检查语法并提供一些例子(期望结果,实际结果)
  • @leonbloy 在末尾添加了一个小描述作为编辑,如果仍然不清楚,请告诉我。
  • @leonbloy 解决了,将其作为答案发布

标签: postgresql common-table-expression


【解决方案1】:

AND calltime::time &gt;= '00:21:09' AND calltime::time &lt;= '21:11:21' 添加到WHERE calltime &gt;= '07-13-2011 00:21:09' AND calltime &lt;='07-31-2011 21:11:21' 块解决了这个问题。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多