ホーム › フォーラム › A5:SQL Mk-2掲示板 › DBに設定されたタイムゾーンでの日付型の出力
- このトピックには4件の返信、2人の参加者があり、最後にLINKにより5年、 8ヶ月前に更新されました。
-
投稿者投稿
-
かやはらゲスト
お世話になります。
日付型(Timestamp型)の表示について質問させていただきたいです。【環境】
・Postgres 9.6
・OS:Windows 7 or 10 64bit■事象
タイムゾーン有の時刻型(TIMESTAMP WITH TIME ZONE)にUTCで入力した文字が
ソフトウェアにて確認するとOSのタイムゾーン(JST)にて表示される。OSで設定されたタイムゾーンではなく、DBに設定されたタイムゾーンをみて出力する方法をご教示いただきたい。
松原正和キーマスターかやはらさんこんにちは。
TIMESTAMP WITH TIME ZONEは、タイムゾーンの情報(+09とか)付きで日付時刻を保持するというより、タイムゾーンを適宜変換して扱ってくれる型です。
https://www.postgresql.jp/document/9.4/html/datatype-datetime.html によると、以下のような入出力の動作をします。
>timestamp with time zoneについて内部に格納されている値は常にUTCです(協定世界時、歴史
>的にグリニッジ標準時GMTとして知られています)。 時間帯が明示的に指定された入力値は、その
>時間帯に適したオフセットを使用してUTCに変換されます。 入力文字列に時間帯が指定されていな
>い場合は、システムのTimeZoneパラメータに示されている値が時間帯とみなされ、timezone時間
>帯用のオフセットを使用してUTCに変換されます。
>timestamp with time zone値が出力されると、この値はUTCから現行のtimezoneに変換され、そ
>の時間帯のローカル時間として表示されます。 他の時間帯での時間を表示するには、timezoneを
>変更するか、あるいはAT TIME ZONE構文(項9.9.3 を参照)を使用します。
つまり、クライアントで入力した日付時刻はタイムゾーンを考慮してUNIZ TIME(多分)などに変換されて格納され、別のクライアントからクエリーされたときはそのクライアントのタイムゾーンに合わせた形で日付時刻表現に変換されて表示されます。
例えば、タイムゾーンが UTC のクライアントで 2018/11/11 0:00:00 を挿入(又は更新) した場合、 日本(JST)のクライアントでクエリーすると 2018/11/11 9:00:00 として表示されます。
ちなみに、to_char(current_timestamp, ‘YYYY/MM/DD HH24:MI:SS TZ’) 等とすると、to_char()は当然サーバーで処理されることになるので、サーバーのタイムゾーンで文字列に変換されることになるようです。LINKゲストお世話になります。
この件につきまして再確認させてください。DB:日本以外(たとえば中国 +8:00)
クライアント:日本 +9:00
A5M2を使用して日本から中国サーバーを確認すると日本時間で表示されるという認識でよろしいでしょうか?
また、その場合DBのtimezoneのまま確認するにはクライアントPCのtimezoneを変更する以外にないのでしょうか?
何もせずに、現地のtimezoneのまま表示できる方法があればご教示ください。
*動作環境はからはら様と同じ前提です。以上、よろしくお願いします。
松原正和キーマスターLINKさんこんにちは。
timestamp with timezone は、入力したときのタイムゾーンも合せて記録してくれるデータ型ではなく、各クライアントごとにタイムゾーン情報を考慮して変換してくれるデータ型です。
一方、timestamp without timezoneはタイムゾーンを考慮しない(内部的には単にUTCで扱っているだけと思われる)データ型です。
なので、LINKさんの要件では、timestamp with timezoneではなく、timestamp without timezoneを使うのが良いのだと思われます。LINKゲストお世話になります。
確認と返信ありがとうございます。
ツール側では無く、項目の型のほうが重要ということですね。
確認しておきます。ありがとうございました。
-
投稿者投稿