PostgreSQL日期時間字段類型選擇指南
最近在用KingFusion低代碼平臺開發(fā)MES系統(tǒng)的這個項目中使用的是PG數(shù)據(jù)庫。
今天在在存儲一個日期+時間格式的數(shù)據(jù)時報錯,于是借此整理下日期時間字段該選擇何種數(shù)據(jù)類型。
對于存儲 2026-05-18 11:05:17 這種日期 + 時間格式的數(shù)據(jù),PostgreSQL 官方推薦使用 timestamp without time zone 類型(通常簡稱為 timestamp)。
一、最佳選擇:timestamp without time zone
1. 基本特性
- 存儲內(nèi)容:精確到微秒的日期和時間(
YYYY-MM-DD HH:MM:SS.ffffff) - 存儲大小:8 字節(jié)
- 精度范圍:4713 BC 到 294276 AD
- 默認精度:6 位小數(shù)(微秒級),可手動指定精度(如
timestamp(3)表示毫秒級)
2. 表設計示例
CREATE TABLE your_table (
id serial PRIMARY KEY,
create_time timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP, -- 推薦寫法
update_time timestamp
);3. 插入數(shù)據(jù)示例
-- 直接使用字符串插入,PG會自動轉(zhuǎn)換
INSERT INTO your_table (create_time) VALUES ('2026-05-18 11:05:17');
-- 也可以使用標準函數(shù)
INSERT INTO your_table (create_time) VALUES (NOW());
INSERT INTO your_table (create_time) VALUES (CURRENT_TIMESTAMP);二、其他相關類型對比
| 類型 | 存儲內(nèi)容 | 適用場景 | 不適用場景 |
|---|---|---|---|
timestamp without time zone | 本地日期 + 時間,無時區(qū)信息 | 所有用戶在同一時區(qū)、只關心本地時間的場景(如國內(nèi)單區(qū)域系統(tǒng)) | 跨時區(qū)應用、需要處理不同時區(qū)用戶的場景 |
timestamp with time zone(簡稱 timestamptz) | UTC 時間戳 + 時區(qū)偏移 | 跨時區(qū)應用、全球用戶系統(tǒng)、需要準確記錄時間點的場景 | 只需要本地時間、不需要時區(qū)轉(zhuǎn)換的場景 |
date | 僅日期(YYYY-MM-DD) | 只需要記錄日期、不需要時間的場景(如生日、訂單日期) | 需要精確到時分秒的場景 |
time without time zone | 僅時間(HH:MM:SS) | 只需要記錄時間、不需要日期的場景(如每日定時任務時間) | 需要完整日期時間的場景 |
varchar/text | 字符串形式的日期時間 | ? 絕對不推薦 | 所有需要日期時間計算、排序、索引的場景 |
三、關鍵注意事項
1. 絕對不要用varchar存儲日期時間
這是最常見的錯誤做法,會導致:
- 無法使用 PG 強大的日期時間函數(shù)(如
DATE_TRUNC、AGE、EXTRACT) - 排序錯誤(字符串排序
2026-05-18會排在2026-05-2前面) - 索引失效,查詢性能極差
- 數(shù)據(jù)格式不統(tǒng)一,容易出現(xiàn)臟數(shù)據(jù)
2.timestampvstimestamptz核心區(qū)別
- 存儲方式:兩者都占用 8 字節(jié),
timestamptz實際存儲的是 UTC 時間戳 - 顯示方式:
timestamptz會根據(jù)數(shù)據(jù)庫或客戶端的時區(qū)自動轉(zhuǎn)換顯示 - 推薦原則:
- 國內(nèi)單區(qū)域系統(tǒng):用
timestamp即可 - 跨時區(qū) / 全球化系統(tǒng):用
timestamptz,統(tǒng)一存儲 UTC 時間
- 國內(nèi)單區(qū)域系統(tǒng):用
3. 關于datetime類型
PostgreSQL 雖然支持 datetime 類型,但這是為了兼容 MySQL 而保留的別名,本質(zhì)上和 timestamp without time zone 完全一樣。官方推薦直接使用 timestamp。
四、最佳實踐總結(jié)
- 存儲
2026-05-18 11:05:17這種格式:使用timestamp without time zone - 需要跨時區(qū)處理:使用
timestamp with time zone - 只需要日期:使用
date - 設置默認值:推薦使用
CURRENT_TIMESTAMP自動記錄創(chuàng)建時間 - 避免使用:
varchar、text、datetime(別名)
以上就是PostgreSQL日期時間字段類型選擇指南的詳細內(nèi)容,更多關于PostgreSQL日期時間字段類型選擇的資料請關注腳本之家其它相關文章!
相關文章
PostgreSQL中json數(shù)據(jù)類型詳解
json數(shù)據(jù)也可以被存儲為text,但是 與text數(shù)據(jù)類型相比,JSON 數(shù)據(jù)類型的優(yōu)勢在于能強制要求每個被存儲的值符合 JSON 規(guī)則,這篇文章主要介紹了PostgreSQL中json數(shù)據(jù)類型,需要的朋友可以參考下2023-04-04
用PostgreSQL數(shù)據(jù)庫做地理位置app應用
項目中用到了postgreSQL中的earthdistance()函數(shù)功能計算地球上兩點之間的距離,中文的資料太少了,我找到了一篇 英文的、講的很好的文章,特此翻譯,希望能夠幫助到以后用到earthdistance的同學2014-03-03
Ubuntu中安裝PostgreSQL步驟及常規(guī)操作指南
PostgreSQL是一款很受歡迎的開源關系型數(shù)據(jù)庫管理系統(tǒng)(RDBMS),擴展性強,處理大量數(shù)據(jù)時效率很高,這篇文章主要介紹了Ubuntu中安裝PostgreSQL步驟及常規(guī)操作的相關資料,文中通過代碼介紹的非常詳細,需要的朋友可以參考下2025-09-09
PostgreSQL中insert_username的擴展使用
insert_username?是 PostgreSQL 的一個實用擴展,用于自動記錄數(shù)據(jù)行的創(chuàng)建者和最后修改者信息,本文就來詳細的介紹一下insert_username擴展,感興趣的可以了解一下2025-06-06
PostgreSQL 向量擴展插件pgvector安裝和使用
本文主要介紹了PostgreSQL 向量擴展插件pgvector安裝和使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2026-05-05
PGSQL查詢最近N天的數(shù)據(jù)及SQL語句實現(xiàn)替換字段內(nèi)容
PostgreSQL提供了WITH語句,允許你構(gòu)造用于查詢的輔助語句,下面這篇文章主要給大家介紹了關于PGSQL查詢最近N天的數(shù)據(jù)及SQL語句實現(xiàn)替換字段內(nèi)容的相關資料,文中通過實例代碼介紹的非常詳細,需要的朋友可以參考下2023-03-03
PostgreSQL教程(十二):角色和權(quán)限管理介紹
這篇文章主要介紹了PostgreSQL教程(十二):角色和權(quán)限管理介紹,本文講解了數(shù)據(jù)庫角色、角色屬性、權(quán)限、角色成員,需要的朋友可以參考下2015-05-05
Postgres bytea類型 轉(zhuǎn)換及查看操作
這篇文章主要介紹了Postgres bytea類型 轉(zhuǎn)換及查看操作,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2020-12-12

