簡體   English   中英

如何在postgreSQL中獲取最后24小時的數據

[英]How to get last 24 hrs data in 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

而不是檢查日期部分,做時間數學來獲得間隔。 使用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確保你不會意外地從未來拿起東西。

如果您使用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

date_part()工作方式類似於extract() ,即它們將從源中提取子字段

-- 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

interval提取day(s)是減去2個timestamp的結果)有點不同。 結果可能取決於間隔是否合理:

-- 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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM