簡體   English   中英

PostgreSQL 的時間戳差異(以小時為單位)

[英]Timestamp Difference In Hours for PostgreSQL

PostgreSQL 是否有TIMESTAMPDIFF()等價物?

我知道我可以減去兩個時間戳以獲得 postgresql INTERVAL 我只想要以 INT 表示的以小時為單位的兩個時間戳之間的差異。

我可以在 MySQL 中這樣做:

TIMESTAMPDIFF(HOUR, links.created, NOW())

我只需要以整數表示的兩個時間戳之間的差異(以小時為單位)。

解決方案對我有用:

SELECT "links_link"."created",
"links_link"."title",
(EXTRACT(EPOCH FROM current_timestamp - "links_link"."created")/3600)::Integer AS "age" 
FROM "links_link"

第一件事突然爆發了

EXTRACT(EPOCH FROM current_timestamp-somedate)/3600

可能不是很漂亮,但可以暢通無阻。 如果定義了間隔間隔的划分,可能會更漂亮。

編輯 :如果你想要大於零,可以使用abs或者最大值(...,0)。 哪個適合你的意圖。

編輯++ :我沒有使用age的原因是帶有單個參數的age ,引用文檔: 從current_date減去(在午夜) 這意味着除非在午夜運行,否則您無法獲得准確的“年齡”。 現在幾乎是凌晨1點:

select age(current_timestamp);
       age        
------------------
 -00:52:40.826309
(1 row)

獲取postgresql中時間戳大於日期的字段:

SELECT * from yourtable 
WHERE your_timestamp_field > to_date('05 Dec 2000', 'DD Mon YYYY');

從postgresql中的時間戳減去分鍾數:

SELECT * from yourtable 
WHERE your_timestamp_field > current_timestamp - interval '5 minutes'

從postgresql中的時間戳減去小時數:

SELECT * from yourtable 
WHERE your_timestamp_field > current_timestamp - interval '5 hours'

Michael Krelin的答案很接近並不完全安全,因為在極少數情況下它可能是錯誤的。 問題是PostgreSQL中的間隔沒有關於夏令時等內容的上下文。 間隔內部存儲的內容為數月,日和秒。 在這種情況下,月份不是問題,因為減去兩個時間戳只使用天和秒,但“天”可能是個問題。

如果您的減法涉及夏令時轉換,則某一天可能分別被視為23或25小時。 間隔將考慮到這一點,這對於了解符號意義上傳遞的天數很有用,但它會給出錯誤的實際小時數。 間隔的時期將把所有天數乘以24小時。

例如,如果完整的“短”日和第二天的額外小時,則間隔將記錄為一天和一小時。 轉換為epoch / 3600的是25小時。 但實際上23小時+ 1小時應該總共24小時。

所以更安全的方法是:

(EXTRACT(EPOCH FROM current_timestamp) - EXTRACT(EPOCH FROM somedate))/3600

正如邁克爾在后續評論中提到的那樣,你也可能想要使用floor()或round()來將結果作為整數值。

您可以在間隔和時間戳上使用“extract”或“date_part”函數,但我認為這不符合您的要求。 例如,它給出3個間隔為“2天,3小時”。 但是,您可以通過將'epoch'指定為所需的時間元素將間隔轉換為秒數: extract(epoch from '2 days, 3 hours'::interval)返回183600(然后除以3600轉換為幾秒鍾到幾小時)。

所以,把這一切放在一起,你基本上得到邁克爾的答案: extract(epoch from timestamp1 - timestamp2)/3600 既然你似乎並不關心哪個時間戳在哪個之前,你可能想把它包裝在abs

SELECT abs(extract(epoch from timestamp1 - timestamp2)/3600)

postgresql獲取時間戳之間的秒差

SELECT (
    (extract (epoch from (
        '2012-01-01 18:25:00'::timestamp - '2012-01-01 18:25:02'::timestamp
                         )
             )
    )
)::integer

打印:

-2

因為時間戳相隔兩秒。 取數字除以60得到分鍾,再除以60得到幾小時。

對於許多喜歡利用數據庫功能的開發人員來說,這可能聽起來很瘋狂,

但是在詳盡的問題思考,使用php比較日期函數創建和修復mysql和postgrsql的應用程序之后,我得出結論(對我自己而言),最簡單的方法,即最簡單的SQL問題,不要利用其中任何一個。

為什么? 因為如果您使用像PHP這樣的中間件語言進行開發,PHP具有所有這些功能,並且在比較整數時,它們更容易在應用程序中實現。 PostgreSQL時間戳是NOT == UNIX TIMESTAMP和MySQL的UNIX TIMESTAMP不是PostgresQL或Oracles時間戳..如果你使用數據庫時間戳,它會變得更難移植..

所以只使用整數,而不是時間戳,作為自1970年1月1日午夜以來的秒數。 並且不介意數據庫時間戳。 ,並使用gmdate()並將所有內容存儲為gmt時間以避免時區問題。

如果您需要在應用程序中搜索,排序或比較其他數據,或月份或年份或星期幾或其他任何日期,以及time_day,time_hour,time_seconds等的INTEGER數據類型,或者您需要的任何內容要搜索的索引將使更順暢和更便攜的數據庫。 在大多數情況下,您只需使用一個字段:INTEGER time_created NOT NULL

(您的數據庫行中的更多字段是我找到的此解決方案的唯一缺點,並且這不會導致許多頭痛或咖啡:)

php的日期函數在比較日期時非常出色,但在mysql或postgresql中,比較日期? nah ..使用整數sql比較

我意識到它可能更容易在插入函數上使用CURRENT_TIMESTAMP。 哈! 不要被愚弄。

如果time-intitialized是postgresql時間戳,則無法執行DELETE FROM SESSION_TABLE WHERE time-initialized < '2 days' 但你可以這樣做:

DELETE FROM SESSION_TABLE WHERE time_initialized < '$yesterday'

只要你將PHP中的$昨天設置為自1970年以來的秒數整數。

與比較postgresql select語句中的時間戳相比,這更容易管理會話記錄。

SELECT age(),SELECT extract()和asbtime本身就令人頭疼。 這只是我的看法。

你可以用php日期對象做加法,減法,<,>

_peter_sysko U4EA Networks,Inc。

extract(hour from age(now(),links.created))為您提供小時差異的全面計數。

為了避免紀元轉換,您可以提取天數乘以 24 並添加小時數的提取。

select current_timestamp, (current_timestamp - interval '500' hour), (extract(day from (current_timestamp - (current_timestamp - interval '500' hour)) * 24) + extract(hour from (current_timestamp - (current_timestamp - interval '500' hour))));

對於 MySQL timestampdiff 我不知道,但對於 MSSQL datediff(hour, start, end) PostgreSQL 中最好的等價物是 floor(extract(epoch from end - start)/3600),因為在 MSSQL 中選擇 datediff(hour,'2021 -10-31 18:00:00.000', '2021-10-31 18:59:59.999') 返回 0

暫無
暫無

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

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