PostgreSQLのtimestampの 'without time zone' と 'with time zone' の違い

このQ&Aのポイント
  • PostgreSQLのtimestampの 'without time zone' と 'with time zone' の違いについて教えてください。
  • timestampのデータ型には、'without time zone' と 'with time zone' の2つのオプションがあります。
  • これらの違いと、それぞれの用途について詳しく説明してください。
回答を見る
  • ベストアンサー

postgresのtimestampの『witho

postgresのtimestampの『without time zone』と『with time zone』の違いを教えてください。 timestamp [ (precision) ] without time zone timestamp [ (precision) ] with time zone PostgreSQL 9.6.1文書を読んでみましたがイマイチ理解できていません。 https://www.postgresql.jp/document/9.6/html/datatype-datetime.html#datatype-datetime-input ざっくり何が違って、どういう用途で使い分けるのか教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
  • t_ohta
  • ベストアンサー率38% (5069/13245)
回答No.2

タイムスタンプデータにタイムゾーン情報が付加されるか、されないかの違いです。 データにタイムゾーン情報がない場合、そのデータはクライアントのタイムゾーンの値だと解釈されます。 タイムゾーンが日本時間(+9)のクライアントにとって '2017-03-07 12:00:00' は日本時間の3月7日お昼の12時で、UTC に直すと「3月7日午前3時」です。 このデータをタイムゾーンがハワイ時間(-10)のクライアントが見るとハワイ時間の3月7日お昼の12時で、UTC に直すと「3月7日午後10時」です。 同じデータを見ているのにクライアントのタイムゾーンが異なると全く違う時間を指している事になり、グローバルで利用するデータの場合は不都合が生じます。(アメリカなんかは国内でも時差があるからローカルでも一大事) なので、タイムゾーンの異なるクライアントから参照される可能性があるなら「with time zone」にして、どこのタイムゾーンから参照されても同じ時刻と解釈されるようにします。 一方、タイムゾーンを気にしなくてもよい場合は「without time zone」にしてデータ量を減らす事ができます。

questorfe
質問者

お礼

有難うございます。 大は小を兼ねる状態ですか? 「without time zone」をあえて使うメリットはデータ量を減らす事だけですか? また、それで減らせるデータ量は、無視できないレベルのものですか?

その他の回答 (2)

  • t_ohta
  • ベストアンサー率38% (5069/13245)
回答No.3

> 大は小を兼ねる状態ですか? > 「without time zone」をあえて使うメリットはデータ量を減らす事だけですか? 利用する環境次第で選択が変わってきます。 タイムゾーンの違いを意識してDBサーバ、アプリケーションの構築・開発をしていれば「with time zone」が有効に動作しますが、どこかにいい加減な設定があると途端に時間が狂います。 「without time zone」を使っているとタイムゾーンの設定の違いによる変換が無いため、そこに書かれている時間をそのままローカルタイムとして処理できます。 タイムゾーンが違う人同士が時間情報のやりとりをしないのであれば、設計やメンテナンスで楽できると言うメリットがありますし、DBサーバやアプリサーバの設定が変更できない状況下で勝手な変換が行われないようにできるというメリットはあります。 > また、それで減らせるデータ量は、無視できないレベルのものですか? データ本体はどちらも8バイトなので同じですが、ログの量には効いてきます。 1レコードにタイムスタンプが1カラムあるとして、もっとも長いタイムゾーン表記は「 +hh:mm」ですから7バイトです。 これを100万行書き込んだら700万バイト=7メガバイトになります。 もちろん圧縮したりバイナリー化したりして小さくしますが、大量のデータ更新が発生する環境下ではバカになりません。

questorfe
質問者

お礼

有難うございました。

回答No.1

この記事が参考になると思います。 http://scientre.hateblo.jp/entry/20150407/datetime_with_time_zone

questorfe
質問者

お礼

有難うございます。 参考になります。

関連するQ&A

  • timestamp with time zone型のデータから日付と時間と取り出したい。

    PHP 4.4.2 + PostgreSQL 7.4.8 です。 今、フィールド「DATE」、データ型「timestamp with time zone」に  2006-12-14 09:00:28.853324+09  というデータが入っています。 このデータをウェブ上で ○月○日○時○分 という形式で表示させたいのですが、どのようにすればよいでしょうか? よろしくお願いします。

  • PostgreSQL:timestamp with time zone型のデータから日付と時間と取り出したい。

    PHP 4.4.2 + PostgreSQL 7.4.8 です。 今、フィールド「DATE」、データ型「timestamp with time zone」に  2006-12-14 09:00:28.853324+09  というデータが入っています。 このデータをウェブ上で ○月○日○時○分 という形式で表示させたいのですが、 to_char以外の方法で実現させるにはどのようにすればよいでしょうか? よろしくお願いします。

    • ベストアンサー
    • PHP
  • 時間の差分

    初めまして。 早速質問をさせていただきたいと思います。 postgresとPHPを使って開発中です。 postgresでは、timestamp without time zone型にデータを保存しております。 それを取得して、現在の時間との差分が1分以内だったら・・・という処理を したいのですが、mktime()を使ったり、strtotime()を使ったりして ためしたのですが、うまくいきません。 //$date → postgresから取得したtimestamp $diff = time() - strtotime($date); if ($diff < 60) {   ** 処理 ** } ご教授よろしくお願いいたします。

    • ベストアンサー
    • PHP
  • timestamp が空のデータを除いて、データを選択したい

    テスト用に簡単なテーブルを作成してみました。 テーブル名:timetest フィールド: test_id : integer NOT NULL test_date : timestamp without time zone テストデータとして 1,2005-11-15 14:01:40.026 2,NULL 3,2005-11-14 11:11:11.001 このときに test_date がNULL以外のものだけを選択したいのですが、 slect * from timetest where test_date != null; では1件も選択されず、 select * from timetest where test_date != ''; では、 ERROR: invalid input syntax for type timestamp: "" というエラーになってしました。 どなたかご教授お願い致します。

  • 単純なselectが遅くなるのですが、理由がサッパリわかりません

    初めて投稿させて頂きます。 過去に、PostgreSQL 7.4.6(Linux 2.6.9-5.EL)の環境で、データ監視系のシステムを構築しました。稼働してから数年が経過しています。 このシステムのDBには数十のテーブルがあり、期待通りに動いています。 ただ、一つのテーブルのみ、時間が経過の経過と共にselectが恐ろしく遅くなる現象が発生しています。 そのテーブルのスキーマは以下です。 =# \d node_condition; Table "public.node_condition" Column | Type | Modifiers ------------------+-----------------------------+----------- node_id | integer | checktime | timestamp without time zone | ping | boolean | rtt | real | cpu | real | loadavg | real | mem | real | disk | real | snmp_w | integer | ip_w | integer | serv_w | integer | licence | integer | f_licence | integer | version | text | web_ver | text | sync | boolean | errchecktime | timestamp without time zone | ipwatchtime | timestamp without time zone | servwatchtime | timestamp without time zone | nmsdlasttime | timestamp without time zone | filemakelasttime | timestamp without time zone | 現在入力されているデータ数は51ラインです。 設計上、このテーブルは約1分間に51回updateが行われます。 主に時間系の更新です。 他のテーブルと違うところは、カラム数が少し多い、updateが頻繁に実行される、というくらいです。他のテーブルは多くても12カラムで、子のような現象は出ていません。 SQL(select)は至ってシンプルで、このテーブルしか参照しません。(select node_id,checktime ... from node_condition;) 構築時の応答速度は至って普通だったのですが、昨年の夏に異常に遅くなっていることが判明しました。 その時は、データを退避してからテーブルをDROPしてcreateし直すという荒業で解決したのですが、先日また異常に遅くなっている事に気づきました。 (この時点で原因を潰すべきだったのですが、忙しくて強引にやってしまいました。ちなみに、その時VACUUM,ANALYZEはやったのですが、効果がありませんでした。また、このシステムではVACUUM,ANALYZEが定期的に実行されています。) postgresはupdateのアルゴリズムは、他のRDBMSと違うような事が書いてありましたが、カラム数が多くなると挙動に影響が出るのでしょうか。どなたか詳しい方がいましたら、ご教授頂けると助かります。

  • PostgreSQLのテーブル構造を取得したい

    現在PostgreSQLとPHP5を利用してアプリケーションを開発しております。 PHPにて現在すでに存在するPostgreSQLのテーブルの定義情報を取得するにはどうすればよろしいでしょうか。テーブルの定義情報は下記のようにSQLのCREATE文で取得したいと思っております。 CREATE TABLE favorite ( code serial NOT NULL, reg_date timestamp without time zone NOT NULL DEFAULT now(), update_date timestamp without time zone, title text, url text, u_id character varying(20) NOT NULL, enabled_flag smallint NOT NULL DEFAULT 1, CONSTRAINT web_favorite_pkey PRIMARY KEY (fv_code) ) 何卒よろしくお願いいたします。

  • PostgreSQLからMySQLへ変換

    現在ECサイトに追加カスタマイズ機能を導入したいと考えているのですが、 その際の使用コードが以下のようにPostgreSQLの記載となっており、 使用しているphpMyAdminにてSQLコードを入力するとエラーとなってしまいます。 ↓PostgreSQLコード CREATE TABLE dtb_bookmark ( bookmark_id serial NOT NULL, customer_id integer NOT NULL, product_id integer NOT NULL, memo text, create_date timestamp without time zone NOT NULL, update_date timestamp without time zone NOT NULL, del_flg integer ); ALTER TABLE ONLY dtb_bookmark ADD CONSTRAINT dtb_bookmark_pkey PRIMARY KEY (bookmark_id); COMMENT ON TABLE dtb_bookmark IS 'お気に入り情報'; エラーはtimestamp型とALTER以降の文で発生致します。 mysql文にて解釈させるにはどのように変更したらよろしいのでしょうか? 使用mysqlバージョンはMySQL 4.1.21です。 アドバイスなど頂けましたら幸いです。 よろしくお願い致します。

    • ベストアンサー
    • MySQL
  • テーブル作成時にエラー?

    こんにちは。 以下のような環境で操作を行っています。 RedHatLinux9.0 PostgreSQL 8.0.3 テーブル作成時に次のようなメッセージが出力され、テーブルを作成することができません。 NOTICE: CREATE TABLE / PRIMARY KEY will create implicit index "PK_SIKYO" for table "TM_SIKYO" ちなみに実行したSQL文は次の通りです。 CREATE TABLE "TOUSHIN"."TM_SIKYO" ( "SHIKYO_CD" int4 NOT NULL DEFAULT nextval('"TOUSHIN"."TM_SIKYO_SHIKYO_CD_seq"'::text), "SHIKYO_NM" varchar(50), "SHIKYO_RNM" varchar(50), "SHOW_FLAG" bool, "UNUSE_FLAG" bool, "CREATE_DATE" timestamp DEFAULT ('now'::text)::timestamp(6) with time zone, "CREATE_ID" varchar(10), "CHANGE_DATE" timestamp DEFAULT ('now'::text)::timestamp(6) with time zone, "CHANGE_ID" varchar(10), CONSTRAINT "PK_SIKYO" PRIMARY KEY ("SHIKYO_CD") ) WITHOUT OIDS; SQL文はWindows版のPostgreSQLから作成したものを、そのままコピーして利用しました。 プライマリーキーが正しく設定できていないようなメッセージだと思うのですが、対処法など詳しいことが分からずに困っています。 Windows版から出力したSQL文なので、SQL文に間違いがありそうな感じでもないですし、一体何が原因なのでしょうか?

  • Postgreの日付関数に関して教えてください。

    Postgreの日付関数に関して教えてください。 表9.30 日付/時刻関数の例を実行していますが、 make_ で始まる関数がすべて失敗します。 PostgreSQL 9.6.2文書 9.9. 日付/時刻関数と演算子 https://www.postgresql.jp/document/9.6/html/functions-datetime.html 表9.30 日付/時刻関数 select age(timestamp '2001-04-10', timestamp '1957-06-13') select age(timestamp '1957-06-13')  : : select make_date(2013, 7, 15) select make_interval(days => 10) select make_time(8, 15, 23.5) select make_timestamp(2013, 7, 15, 8, 15, 23.5) select make_timestamptz(2013, 7, 15, 8, 15, 23.5) make_dateの失敗のメッセージ ERROR: function make_date(integer, integer, integer) does not exist LINE 1: select make_date(2013, 7, 15) ^ HINT: No function matches the given name and argument types. You might need to add explicit type casts. ********** エラー ********** ERROR: function make_date(integer, integer, integer) does not exist SQLステート:42883 ヒント:No function matches the given name and argument types. You might need to add explicit type casts. 文字:8 何が悪いのでしょうか。

  • Postgres9インストールFlexが古い?

    お世話になります。 Centos5.8 64bitにPostgres9.0.8をソースからインストールしようとしていますが、./configure 実行時、以下のようなFlexの警告が表示されます。 どこに問題があるのかご存知の方教えていただけませんでしょうか? $ cd /usr/local/src/postgresql-9.0.8 $ ./configure checking for flex... configure: WARNING: *** The installed version of Flex, /usr/bin/flex, is too old to use with PostgreSQL. *** Flex version 2.5.31 or later is required, but this is /usr/bin/flex version 2.5.4. configure: WARNING: *** The installed version of Flex, /usr/bin/lex, is too old to use with PostgreSQL. *** Flex version 2.5.31 or later is required, but this is /usr/bin/lex version 2.5.4. no configure: WARNING: *** Without Flex you will not be able to build PostgreSQL from Git nor *** change any of the scanner definition files. You can obtain Flex from *** a GNU mirror site. (If you are using the official distribution of *** PostgreSQL then you do not need to worry about this because the Flex *** output is pre-generated.) checking for perl... /usr/bin/perl configure: using perl 5.8.8 checking for main in -lm... yes checking for library containing setproctitle... no checking for library containing dlopen... -ldl checking for library containing socket... none required checking for library containing shl_load... no checking for library containing getopt_long... none required checking for library containing crypt... -lcrypt checking for library containing fdatasync... none required checking for library containing gethostbyname_r... none required checking for library containing shmget... none required checking for -lreadline... no checking for -ledit... no configure: error: readline library not found If you have readline already installed, see config.log for details on the failure. It is possible the compiler isn't looking in the proper directory. Use --without-readline to disable readline support. インストールされているバージョンは古くないと思っているのですが、どうずればインストールを進めることができるでしょうか? $ rpm -qa | grep flex flex-2.5.4a-41.fc6 $ which flex /usr/bin/flex どうぞ宜しくお願い致します。