PostgreSQL時區、時間不一致、差8小時

標準時間

標準時間格式即人一眼就能看懂的時間格式,比如:2017/11/28 15:00:00

unix時間戳

unix時間戳格式,就是從1970年1月1日0點0分0秒(UTC/GMT的午夜)開始計時,所經過的秒數。

系統時間與pg時間不一致?

主要原因:是主機和pg的時區配置不一致

//查看系統時間與時區
[root@localhost ~]# date
Mon May 25 10:59:51 CST 2020
[root@localhost ~]# date -R
Mon, 25 May 2020 11:00:22 +0800
//查看系統時區,待補充

//查看pg的時區與時間
postgres=# select now();
now

2020-05-25 13:54:30.800375+08
(1 row)

//查看時區
postgres=# show timezone;
TimeZone

PRC
(1 row)

修改pg時區

//視圖pg_timezone_names保存了所有可供選擇的時區
postgres=# select * from pg_timezone_names;

session級配置

//修改時區,注意此默認爲session級別
postgres=# set time zone ‘PRC’;
SET

用戶級配置

alter role rolname set timezone=‘UTC’;
或者
alter role all set timezone=‘UTC’;

數據庫級配置

alter database dbname set timezone=‘UTC’;

全局配置(永久生效)

//查看配置文件中時區設置,要想永久生效,此時需要修改配置文件
[root@localhost ~]$ grep timezone postgresql.conf
log_timezone = ‘US/Pacific’
timezone = ‘US/Pacific’

//修改完配置時重新加載
[root@localhost ~]$ pg_ctl reload
server signaled
[root@localhost ~]$ psql
postgres=# show time zone;
TimeZone

PRC

pg時間戳數據類型

PostgreSQL 提供兩種存儲時間戳的數據類型: 不帶時區的 TIMESTAMP 和帶時區的 TIMESTAMPTZ。

TIMESTAMP 數據類型可以同時存儲日期和時間,但它不存儲時區。這意味着,當修改了數據庫服務器所在的時區時,它裏面存儲的值不會改變。

TIMESTAMPTZ 數據類型在存儲日期和時間的同時還能正確處理時區。PostgreSQL 使用 UTC 值來存儲 TIMESTAMPTZ 數據。在向 TIMESTAMPTZ 字段插入值的時候,PostgreSQL 會自動將值轉換成 UTC 值,並保存到表裏。當從一個 TIMESTAMPTZ 字段查詢數據的時候,PostgreSQL 會把存儲在其中的 UTC 值轉換成數據庫服務器、用戶或當前連接所在的時區。

TIMESTAMP 和 TIMESTAMPTZ 都使用8字節存儲空間。

在使用TIMESTAMP保存時間時,標準時間格式轉unix時間戳的時候一定要考慮時區問題,原因如下:
linux後臺環境的時區是東八區,東八區的unix時間戳是從1970年1月1日8點0分0秒開始計算的,從postgresql中提取出標準時間(TIMESTAMP)轉換爲unix時間戳的時候,pg默認把這個標準時間是當做格林尼治時間處理的,格林尼治時間要比東八區時間慢8個小時,所以得到的時間會有8小時誤差。

時間函數

日期轉時間戳

select EXTRACT(epoch FROM CAST( '2018-03-08 00:00:00' AS TIMESTAMP))===>1520467200

時間戳轉日期

to_timestamp(duble)
返回類型: timestamp;
描述: 把UNIX紀元時間戳轉日期需要(注意時區)

postgres=# select to_timestamp(3600);
      to_timestamp      
------------------------
 1970-01-01 09:00:00+08

東八區的顯示效果如上,可以看到to_timestamp是考慮時區計算的。

其他日期相關函數
date()函數
select date(‘2018-01-01 10:20:12’)====》2018-01-01

to_date()函數
select to_date(‘2018-03-12 18:47:35’,‘yyyy-MM-dd hh24:mi:ss’) ====>2018-03-12

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章