pg日期轉周 PostgreSQL 日期 時間型別

2021-10-12 15:57:45 字數 2125 閱讀 3480

時區和時區習慣不僅僅受地球幾何形狀的影響,還受到政治決定的影響。到了 19 世紀,全球的時區變得稍微標準化了些,但是還是易於遭受隨意的修改,部分是因為夏時制規則。postgresql 目前支援 1902 年到 2038 年之間的夏時制資訊(對應於傳統 unix 系統時間的完整跨度)。如果時間超過這個範圍,那麼假設時間是所選時區的"標準時間",不管它們落在哪個年份裡面。

postgresql 在典型應用中盡可能與 sql 的定義相相容。但 sql 標準在日期/時間型別和功能上有一些奇怪的混淆。兩個顯而易見的問題是:

date 型別與時區沒有聯絡,而 time 型別卻有或可以有。然而,現實世界的時區只有在與時間和日期都關聯時才有意義,因為時間偏移量(時差)可能因為實行類似夏時制這樣的制度而在一年裡有所變化。

預設的時區用乙個數字常量表示與 utc 的偏移(時差)。因此,當跨 dst(夏時制)界限做日期/時間算術時,我們根本不可能把夏時制這樣的因素計算進去。

為了克服這些困難,我們建議在使用時區的時候,使用那些同時包含日期和時間的日期/時間型別。我們建議不要使用 time with time zone 型別(儘管 postgresql 出於合理應用以及為了與其它 rdbms 相容的考慮支援這個型別)。postgresql 假設你用於任何型別的本地時區都只包含日期或時間(而不包含時區)。

在系統內部,所有日期和時間都用全球統一時間 utc 格式儲存,時間在發給客戶前端前由資料庫伺服器根據 timezone 配置引數宣告的時區轉換成本地時間。

postgresql 允許你用三種方法指定時區:

完整的時區名。例如 america/new_york 。所有可以識別的時區名在 pg_timezone_names 檢視中列出(參見節43.49)。postgresql 使用廣泛使用的 zic 時區資料,所以這些時區名在其它軟體裡也能被輕鬆的識別。

時區縮寫。例如 pst 。這種縮寫名通常只是定義了相對於 utc 的偏移量,而前一種完整的時區名可能還隱含著一組夏時制轉換規則。所有可以識別的時區縮寫在 pg_timezone_abbrevs 檢視中列出(參見節43.48)。你不能使用時區縮寫來設定 timezone 配置引數,但是你可以在日期/時間輸入值中結合 at time zone 操作符使用時區縮寫。

除完整的時區名及其縮寫之外,postgresql 還接受 posix 風格的 stdoffset 或 stdoffsetdst 格式的時區,其中的 std 是時區縮寫、offset 是乙個相對於 utc 的小時偏移量、dst 是乙個可選的夏時制時區縮寫(假定相對於給定的偏移量提前一小時)。例如,如果 est5edt 不是乙個已識別的時區名,那麼它將等同於美國東部時間,如果存在夏時制時區,那麼它將按照美國的時區規則使用,因此這個特性在北美州之外沒什麼用處。需要提醒的是這個特性會導致悄悄的接受不合理的輸入,因為它不對時區縮寫的合理性做檢查。例如,set timezone to foobar0 不會報錯,而是使系統使用 gmt 。

完整的時區名與時區縮寫在理論與實踐之間存在差異:時區縮寫總是代表乙個相對於 utc 的固定偏移量,然而大多數完整的時區名隱含著乙個本地夏令時規則,因此就有可能有兩個相對於 utc 的不同偏移量。

總體而言,postgresql 8.2 版本以後時區名在所有情況下都是大小寫無關的。而之前的版本在某些情況下是大小寫敏感的。

無論是完整的時區名還是時區縮寫都不是硬連線進伺服器的,它們都是從安裝目錄下的 .../share/timezone/ 和 .../share/timezonesets/ 配置檔案中獲取的(參見章b.3)

可以在 postgresql.conf 檔案裡設定 timezone 配置引數,或者用任何其它在章17描述的標準方法。除此之外,還有好幾種特殊方法可以設定它:

如果既沒有在 postgresql.conf 裡也沒有在命令列開關上宣告 timezone ,那麼伺服器將試圖使用伺服器主機上的 tz 環境變數作為伺服器的預設時區。如果 tz 沒有定義或者是 postgresql 不認識的時區名,那麼伺服器將試圖通過檢查 c 庫函式 localtime() 的行為來判斷作業系統的預設時區。預設時區是按照最接近 postgresql 的已知時區的原則來選擇的。

使用 sql 命令 set time zone 為會話設定時區,這是 set timezone to 的乙個可選的拼寫方式,更加相容標準。

如果在客戶端設定了 pgtz 環境變數,那麼 libpq 在連線時將使用這個環境變數給後端傳送乙個 set time zone 命令。

pg日期轉周 postgres時間轉換函式

1.decode 用 case when a 1 then b else c end 2.最後一天 to date 1 mons interval,yyyy mm 1 3.第一天 to date yyyy mm date trunc month 4.欄位別名 加上 as 5.子查詢一定要用別名 6....

PHP 日期轉時間戳,時間戳轉日期

在開發過程中,我們經常碰到日期與時間戳相關的功能,今天趁此機會做個詳細筆記。date default timezone set prc 把時間調到北京時間,php5預設為格林威治標準時間 echo time 獲取d當前時間戳 輸出 1598963507 echo date y m d h i s t...

mysql日期加減《轉》

1.mysql 為日期增加乙個時間間隔 date add set dt now select date add dt,interval 1 day 加1天 select date add dt,interval 1 hour 加1小時 select date add dt,interval 1 mi...