真实的国产乱ⅩXXX66竹夫人,五月香六月婷婷激情综合,亚洲日本VA一区二区三区,亚洲精品一区二区三区麻豆

成都創(chuàng)新互聯(lián)網(wǎng)站制作重慶分公司

PostgreSQL時間戳與Oracle的不同的是什么

這篇文章給大家介紹PostgreSQL時間戳與Oracle的不同的是什么,內(nèi)容非常詳細(xì),感興趣的小伙伴們可以參考借鑒,希望對大家能有所幫助。

讓客戶滿意是我們工作的目標(biāo),不斷超越客戶的期望值來自于我們對這個行業(yè)的熱愛。我們立志把好的技術(shù)通過有效、簡單的方式提供給客戶,將通過不懈努力成為客戶在信息化領(lǐng)域值得信任、有價值的長期合作伙伴,公司提供的服務(wù)項目有:域名申請雅安服務(wù)器托管、營銷軟件、網(wǎng)站建設(shè)、峨邊彝族網(wǎng)站維護(hù)、網(wǎng)站推廣。

PG有兩種時間戳:1、timestamp without time zone;2、timestamp with time zone;實際在內(nèi)部存儲上它們并沒有什么不同。內(nèi)部名字分別是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字節(jié),保存的是微秒,內(nèi)部定義是

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;

前兩個類型分別對應(yīng)timestamp和timestamptz,最后一個Interval對應(yīng)的是類型interval(其他文章提到interval類型的datum是指向數(shù)據(jù)的指針,就是它了)。

再來看輸入函數(shù) timestamptz_in(src/backend/utils/adt/timestamp.c),前邊是語法分析(沒錯,這里嵌了個小語法分析器)解析字符串,如果輸入格式是我們常見的諸如:2019-07-09 14:19:34.255 CST 指定時區(qū),它會調(diào)用tm2timestamp,在這個函數(shù)里有一個根據(jù)時區(qū)做的調(diào)整 dt2local,也就是說最后存儲的時間并沒有記錄輸入的時區(qū)。

再來看Oracle,它有三種時間戳 1、timestamp without time zone;2、timestamp with time zone;3、timestamp with local time zone;

從文檔來看,最后一種是不保存輸入時區(qū)的,調(diào)整為數(shù)據(jù)庫時區(qū),其實這個類型更像PG的timestamp with time zone,而PG并沒有類型能夠?qū)?yīng)Oralce的timestamp with time zone。

先體驗一下Oracle下的操作

SQL> CREATE TABLE t(col1 TIMESTAMP WITH TIME ZONE);

表已創(chuàng)建。

SQL> desc t
 名稱                                      是否為空? 類型
 ----------------------------------------- -------- ----------------------------

 COL1                                               TIMESTAMP(6) WITH TIME ZONE

SQL>

默認(rèn)精度為6

SQL> INSERT INTO t VALUES('15-7月 -19 11.15.46.369000 上午 +08:00');

已創(chuàng)建 1 行。

SQL> INSERT INTO t VALUES('15-7月 -19 11.15.46.369000 上午 +09:00');

已創(chuàng)建 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)

插入數(shù)據(jù)本身的時區(qū)屬性其實已經(jīng)消失。

可以設(shè)想,如果有一個場景客戶對每個輸入時間的本地時間更感興趣,希望查詢時原樣查出,PG一樣可以應(yīng)對,但明顯要給應(yīng)用開發(fā)端找些麻煩了。

自定義類型可以很好滿足這個需求,不管是讓PG內(nèi)嵌,還是我們自行定義復(fù)合類型,都是可以的,有機會再演示。

關(guān)于PostgreSQL時間戳與Oracle的不同的是什么就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,可以學(xué)到更多知識。如果覺得文章不錯,可以把它分享出去讓更多的人看到。


分享題目:PostgreSQL時間戳與Oracle的不同的是什么
文章鏈接:http://weahome.cn/article/gihiji.html

其他資訊

在線咨詢

微信咨詢

電話咨詢

028-86922220(工作日)

18980820575(7×24)

提交需求

返回頂部