Postgresql
如何在 PostgreSQL 中最好地儲存時間戳?
我正在研究 PostgreSQL 數據庫設計,我想知道如何最好地儲存時間戳。
假設
不同時區的使用者將使用數據庫執行所有 CRUD 功能。
我看過2個選項:
timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC')
bigint NOT NULL DEFAULT
因為**
timestamp
**我將發送一個字元串,該字元串將代表 INSERT 時刻的確切 (UTC) 時間戳。因為**
bigint
**我會儲存完全相同的東西,但是以數字格式。(時區問題在將毫秒移交給伺服器之前處理,因此始終為 UTC 毫秒。)儲存 a 的一個主要優點
bigint
可能是更容易儲存和檢索,因為傳遞正確格式的時間戳比簡單的數字(自 Unix Epoc 以來的毫秒數)更複雜。我的問題是哪一個可以實現最靈活的設計,以及每種方法的缺陷是什麼。
將時間戳儲存為
timestamp
,或者更確切地說是**timestamptz
**(timestamp with time zone
),因為您正在處理多個時區。這會強制執行有效數據,並且通常是最有效的。一定要了解數據類型,存在一些誤解:為了解決您的問題:
傳遞正確格式的時間戳比簡單的數字更複雜
如果您願意,您可以通過任何一種方式傳遞和檢索 UNIX 紀元:
SELECT to_timestamp(1437346800) , extract(epoch FROM timestamptz '2015-07-20 01:00+02');
有關的:
如果要儲存目前時間戳並寫入數據庫,請使用
timestamptz
具有預設值的列now()
。數據庫伺服器上的系統時間通常比多個客戶端送出各自的時間概念更可靠和一致。因為
INSERT
它可以很簡單:CREATE TABLE foo ( ... -- other columns , created_at timestamptz NOT NULL DEFAULT now() );
只是不要寫到那個專欄。它是自動填寫的。