這篇文章給大家介紹PostgreSQL時間戳與Oracle的不同的是什么,內容非常詳細,感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。
PG有兩種時間戳:1、timestamp without time zone;2、timestamp with time zone;實際在內部存儲上它們并沒有什么不同。內部名字分別是timestamp和timestamptz(類型名字問題以前博文講過,請自行閱讀),OID分別是1114和1184。
它們的類型定義:
flying=# select typname,typlen,typstorage,typinput from pg_type where oid in (1114,1184); typname | typlen | typstorage | typinput -------------+--------+------------+---------------- timestamp | 8 | p | timestamp_in timestamptz | 8 | p | timestamptz_in (2 rows) flying=#
都是8字節,保存的是微秒,內部定義是
typedef int64 Timestamp;
typedef int64 TimestampTz;
typedef int64 TimeOffset;
typedef int32 fsec_t; /* fractional seconds (in microseconds) */
typedef struct
{
TimeOffset time; /* all time units other than days, months and
* years */
int32 day; /* days, after time for alignment */
int32 month; /* months and years, after time for alignment */
} Interval;前兩個類型分別對應timestamp和timestamptz,最后一個Interval對應的是類型interval(其他文章提到interval類型的datum是指向數據的指針,就是它了)。
再來看輸入函數 timestamptz_in(src/backend/utils/adt/timestamp.c),前邊是語法分析(沒錯,這里嵌了個小語法分析器)解析字符串,如果輸入格式是我們常見的諸如:2019-07-09 14:19:34.255 CST 指定時區,它會調用tm2timestamp,在這個函數里有一個根據時區做的調整 dt2local,也就是說最后存儲的時間并沒有記錄輸入的時區。
再來看Oracle,它有三種時間戳 1、timestamp without time zone;2、timestamp with time zone;3、timestamp with local time zone;
從文檔來看,最后一種是不保存輸入時區的,調整為數據庫時區,其實這個類型更像PG的timestamp with time zone,而PG并沒有類型能夠對應Oralce的timestamp with time zone。
先體驗一下Oracle下的操作
SQL> CREATE TABLE t(col1 TIMESTAMP WITH TIME ZONE); 表已創建。 SQL> desc t 名稱 是否為空? 類型 ----------------------------------------- -------- ---------------------------- COL1 TIMESTAMP(6) WITH TIME ZONE SQL>
默認精度為6
SQL> INSERT INTO t VALUES('15-7月 -19 11.15.46.369000 上午 +08:00');
已創建 1 行。
SQL> INSERT INTO t VALUES('15-7月 -19 11.15.46.369000 上午 +09:00');
已創建 1 行。
SQL> SELECT * FROM t;
COL1
---------------------------------------------------------------------------
15-7月 -19 11.15.46.369000 上午 +08:00
15-7月 -19 11.15.46.369000 上午 +09:00
SQL>PG里同樣的操作:
flying=# CREATE TABLE t(col1 TIMESTAMP WITH TIME ZONE);
CREATE TABLE
flying=# show timezone;
TimeZone
----------
UTC
(1 row)
flying=# INSERT INTO t VALUES('2019-7-15 11:15:46.369000 +8');
INSERT 0 1
flying=# INSERT INTO t VALUES('2019-7-15 11:15:46.369000 +9');
INSERT 0 1
flying=# SELECT * FROM t;
col1
----------------------------
2019-07-15 03:15:46.369+00
2019-07-15 02:15:46.369+00
(2 rows)
flying=# show timezone;
TimeZone
----------
UTC
(1 row)插入數據本身的時區屬性其實已經消失。
可以設想,如果有一個場景客戶對每個輸入時間的本地時間更感興趣,希望查詢時原樣查出,PG一樣可以應對,但明顯要給應用開發端找些麻煩了。
自定義類型可以很好滿足這個需求,不管是讓PG內嵌,還是我們自行定義復合類型,都是可以的,有機會再演示。
關于PostgreSQL時間戳與Oracle的不同的是什么就分享到這里了,希望以上內容可以對大家有一定的幫助,可以學到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。