我以某種YYYYMMDD格式獲取日期。我需要將此列轉換為具有特定時區的時間戳。最好/最簡單的方法是什么?
所以如果我有,20210101我想進入2021-01-01 00:00:00.000000我的 TZ。
uj5u.com熱心網友回復:
嚴格來說,您的要求是矛盾的:
我想進入
2021-01-01 00:00:00.000000我的 TZ。
你展示了一個timestamp( timestamp without time zone) 文字,它與時區的概念完全正交(并且不知道)。
但是你想要它"in my TZ",這意味著一個timestamptz( timestamp with time zone) 值,其中相應的文字包括一個時間偏移,如:2021-01-01 00:00:00.000000 01。
由于格式YYYYMMDD是明確的 ISO 格式,您可以安全地轉換為date或timestamp直接。強制轉換timestamp為00:00自動采用時間組件。產生你想要的timestamp '2021-01-01 00:00'.
SELECT '20211203'::timestamp;
如果你想要結果型別timestamp,我們到這里就完成了。
如果你想要結果型別timestamptz,有一個快速而骯臟的快捷方式:
SELECT '20211203'::timestamptz;
當前時區設定被假定為型別轉換。但這引入了對運行時設定的依賴。出了名的不可靠,僅適用于您可以確定當前設定的情況......
確定且通常可取的方法是使用AT TIME ZONE構造明確定義目標時區。假設您的時區是“歐洲/維也納”:
SELECT '20211203'::timestamp AT TIME ZONE 'Europe/Vienna';
使用時區名稱。時區縮寫對于輸入轉換來說是危險的,并且可能會因夏令時 (DST) 或其他官僚主義的廢話而失敗。'CET'(歐洲中部時間)適用于“標準時間”期間的時間戳。在 DST 期間,您必須使用“CEST”(中歐夏令時)。
夏令時完全是無稽之談,但包括歐盟在內的一些國家仍然沒有擺脫它。
db<>fiddle here - 請注意,dbfiddleGB默認使用時區運行。
現在,您有了timestamptz代表給定時區中一天開始時間 (00:00)的值。不要被被愚弄顯示的timestamptz值。它總是根據當前時區設定進行調整,但它總是代表那個獨特的時間點,只是以不同的方式顯示它。
您確實了解時區本身永遠不會存盤在timestamptz值中,對嗎?盡管timestamp with time zone 聽起來可能。看:
- 資料型別為“timestamp with time zone”的時區存盤
強制某個顯示使用to_char()或其他一些函式來生成所需的字串。手冊中有專門的頁面資料型別格式化函式。
有關的:
- https://www.postgresql.org/docs/current/view-pg-timezone-names.html
- 在 Rails 和 PostgreSQL 中完全忽略時區
uj5u.com熱心網友回復:
這是轉換為timestamp with time zone. 您可以將其格式化為您希望的任何文本表示形式。我的時區是東歐時間,EET (GMT 2),所以
select to_date('20211203', 'YYYYMMDD')::timestamp at time zone 'EET';
-- 2021-12-03 00:00:00.000 0200
uj5u.com熱心網友回復:
這個問題似乎假設時間戳可以在寫入時格式化并且它們保留時區資訊。他們不能也不能,這將問題分為兩部分:
1:如何解釋基于文本的時間戳。
create table test_timestamps as
select ('20211203'||'Japan')::timestamptz as "your_timestamp";
PostgreSQL 以二進制格式UTC保存它,因此格式化和時區的整個想法不適用于存盤timestamp型別的資料。它僅在讀取時格式化并在需要時轉換為不同的時區。
2:如何在讀取時以特定格式獲取它們。
select to_char(
"your_timestamp" AT TIME ZONE 'UTC',
'YYYY-MM-DD HH24:MI:SS.US TZHTZM')
from test_timestamps;
at time zone僅當您希望它回傳在其他地方觀察到的時間戳時才需要where 。
uj5u.com熱心網友回復:
為了避免使事情過于復雜:
create table dt_test (id integer, ts_fld timestamp, tsz_fld timestamp with time zone);
insert into dt_test values (1, '20211203'::date, '20211203'::date);
select * from dt_test ;
id | ts_fld | tsz_fld
---- --------------------- ------------------------
1 | 2021-12-03 00:00:00 | 2021-12-03 00:00:00-08
date出于時間戳目的,A將被視為午夜。因此,要么使用它作為date知道它將是午夜或進行顯式轉換:
select '20211203'::date::timestamp, '20211203'::date::timestamptz;
timestamp | timestamptz
--------------------- ------------------------
2021-12-03 00:00:00 | 2021-12-03 00:00:00-08
--Which can be shortened to:
select '20211203'::timestamp, '20211203'::timestamptz;
timestamp | timestamptz
--------------------- ------------------------
2021-12-03 00:00:00 | 2021-12-03 00:00:00-08
取決于您是否要保留時區偏移量。對于便攜性2021-12-03 00:00:00-08將是更好的選擇。
轉載請註明出處,本文鏈接:https://www.uj5u.com/net/374935.html
標籤:PostgreSQL的 日期 时区 sql-时间戳
