私はPostgreSQL DBの設計に取り組んでおり、タイムスタンプをどのように保存するのが最善か疑問に思っています。 仮定 異なるタイムゾーンのユーザーは、すべてのCRUD機能にデータベースを使用します。 私は2つのオプションを見ました: timestamp NOT NULL DEFAULT (now() AT TIME ZONE 'UTC') bigint NOT NULL DEFAULT 以下のためにtimestamp私は、INSERTモーメントの正確な(UTC)のタイムスタンプを表すことになり、文字列を送信します。 以下のためにbigint私はまったく同じことを格納し、その数形式のでしょう。(タイムゾーンの問題はミリスがサーバーに引き渡される前に処理されるため、UTCでは常にミリスです。) を格納するbigintことの主な利点の1つは、正しい形式のタイムスタンプの受け渡しが単純な数値よりも複雑であるため(Unix Epocからのミリ秒)、格納および取得が容易になることです。 私の質問は、どちらが最も柔軟な設計を可能にし、各アプローチの落とし穴になる可能性があるものです。
SQL Server 2016はAT TIME ZONE非決定的と思われます。ただし、これを公式に説明したり、その背後にある理由について理論的根拠を示したりする文書を見つけることができませんでした。 なぜAT TIME ZONE非決定的ですか? 非決定性を示す例 実行中: CREATE TABLE Test ( LegacyTimestamp DATETIME, Timestamp AS LegacyTimestamp AT TIME ZONE 'Eastern Standard Time' PERSISTED ); 次のエラーを返します。 Msg 4936, Level 16, State 1, Line 1 Computed column 'Timestamp' in table 'Test' cannot be persisted because the column is non-deterministic.
Postgres 9.5では、年0001(ゼロ0000年なし)を試しているときに以下の結果が表示されたことに驚きました。 のオフセット-07:52:58? いくつかのサンプルコード。Iの混合使用することを注意TIMESTAMP WITH TIME ZONEしてTIMESTAMP WITHOUT TIME ZONE、慎重に読んでください。 SET TIME ZONE 'America/Los_Angeles' ; SELECT (TIMESTAMP WITH TIME ZONE '2015-01-01 00:00:00.0', TIMESTAMP WITH TIME ZONE '0001-01-01 00:00:00.0Z', TIMESTAMP WITHOUT TIME ZONE '0001-01-01 00:00:00.0Z') ; ("2015-01-01 00:00:00-08","0001-12-31 16:07:02-07:52:58 BC","0001-01-01 00:00:00") 私はその2番目の値に驚いています0001-12-31 16:07:02-07:52:58 BC。America/Los_AngelesUTCから8時間遅れているのと同じように、オフセットを8時間戻し-08:00ます。しかし-08:00、オフセットの代わりにです-07:52:58。どうして? UTCで問題なし UTCでデータを入力する場合、このような問題はありません。 SET TIME ZONE 'UTC' ; …
私はこのstackoverflowの質問に答えていて、奇妙な結果を見つけました: select * from pg_timezone_names where name = 'Europe/Berlin' ; name | abbrev | utc_offset | is_dst ---------------+--------+------------+-------- Europe/Berlin | CET | 01:00:00 | f そして次のクエリ select id, timestampwithtimezone, timestampwithtimezone at time zone 'Europe/Berlin' as berlin, timestampwithtimezone at time zone 'CET' as cet from data ; id | timestampwithtimezone | …