如何在postgreSQL中获取最后24小时的数据

时间:2015-02-09 08:37:17

标签: postgresql

我想获得最后24小时的数据。我在postgreSQL中写了一个查询,如下所示。但我无法按照我的预期得到答案。

 SELECT startdate::timestamp AS startdate,
    (DATE_PART('hour',startdate::timestamp)::integer) as hrs,count(guorderid)
    FROM ord_entitlement
    WHERE DATE_PART('Day',CURRENT_DATE::timestamp - startdate::timestamp) < 1
    AND DATE_PART('hour',startdate::timestamp) <= 24
    GROUP BY  hrs,startdate
    ORDER BY startdate

3 个答案:

答案 0 :(得分:5)

不是检查日期部分,而是使用时间数学来获得间隔。使用NOW()获取时间戳。

SELECT startdate::timestamp AS startdate,
      (DATE_PART('hour',startdate::timestamp)::integer) as hrs, 
      count(guorderid)
FROM ord_entitlement
WHERE NOW() > startdate::timestamptz
  AND NOW() - startdate::timestamptz <= interval '24 hours'
GROUP BY hrs,startdate
ORDER BY startdate

无论您的时区或夏令时如何,这都可确保您获得最后24小时。 NOW() > startdate::timestamptz确保您不会意外地从未来收集东西。

答案 1 :(得分:3)

如果您使用CURRENT_DATE,则无法使用now()功能。请尝试以下方法,

        SELECT startdate::timestamp AS startdate,
        (DATE_PART('hour',startdate::timestamp)::integer) as hrs,count(guorderid)
        FROM ord_entitlement
        WHERE DATE_PART('Day',now() - startdate::timestamptz) < 1
        GROUP BY  hrs,startdate
        ORDER BY startdate

答案 2 :(得分:1)

date_part()的作用类似于extract(),即他们将extract a subfield来自消息来源:

-- they will both yield 9 as result
select date_part('day', date '2015-01-09') "day part of 2015-01-09",
       date_part('day', date '2015-02-09') "day part of 2015-02-09";

因此,提取day(s)不适合选择过去24小时。同样,提取hour(s)将(几乎)总是产生小于或等于24

day(s)中提取interval(这是减去2 timestamp s的结果)略有不同。结果可能取决于间隔是否合理:

-- they will both yield 1 as result
select date_part('day', interval '1 day') "day part of 1 day",
       date_part('day', interval '1 month 1 day') "day part of 1 month 1 day";


-- they will yield 1, 32 and 397 respectively
select date_part('day', timestamp '2015-02-09' - timestamp '2015-02-08') "interval 1",
       date_part('day', timestamp '2015-02-09' - timestamp '2015-01-08') "interval 2",
       date_part('day', timestamp '2015-02-09' - timestamp '2014-01-08') "interval 3";

我认为,根据事实,时间戳减法没有给出合理的间隔不是最好的选择。您可以使用更简单的条件来实现目标:

-- if startdate is a timestamp:
where current_timestamp - interval '1 day' <= startdate

-- if startdate is a date:
where current_date - 1 <= startdate

如果您也想要禁止将来的日期(正如您的问题标题所示),您可以使用单个between条件:

-- if startdate is a timestamp:
where startdate between current_timestamp - interval '1 day' and current_timestamp

-- if startdate is a date:
where startdate between current_date - 1 and current_date