![](/img/trans.png)
[英]Psycopg2 - Query last 24hrs of postgreSQL database cur.execute
[英]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.