[英]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.