1

次のスキーマを持つPostgreSQLテーブルがあります-

CREATE TABLE test (
  id serial NOT NULL PRIMARY KEY,
  username varchar(100) NOT NULL, -- The user name
  dob timestamp with time zone NOT NULL -- The date of birth
);

次に、次のようなデータを含むデータをテーブルに挿入しました-

INSERT INTO "test" ("username", "dob") VALUES (E'Scotty', E'2009-05-14 15:44:43');

そして、DBでデータをチェックすると、次のようになります-

mydb=> select username, dob from test where username='Scotty';
 username |            dob            
----------+---------------------------
 Scotty   | 2009-05-14 15:44:43+05:30
(1 row)

1946年より前の日付のデータを挿入しようとするまでは、すべてが順調でダンディです-

INSERT INTO "test" ("username", "dob") VALUES (E'James T Kirk', E'1945-01-01 11:30:11');

mydb=> select username, dob from test where username='James T Kirk';
      username |            dob            
-------------- +---------------------------
 James T Kirk  | 1945-01-01 11:30:11+06:30
(1 row)

上記の結果を見てください。タイムゾーンの値が+05:30から+06:30にどのように変化したかに注目してください

1942年より前の日付を挿入すると、実際にはさらに悪化します-

INSERT INTO "test" ("username", "dob") VALUES (E'Spock', E'1941-01-01 11:30:11');

mydb=> select username, dob from test where username='Spock';
 username |             dob              
----------+------------------------------
 Spock    | 1941-01-01 11:30:11+05:53:20
(1 row)

これで、タイムゾーン値が完全にマングルされ、日付を解析できなくなりました。

これについて何か助けていただければ幸いです。

私のタイムゾーンはアジア/コルカタ(GMT + 05:30)です。

更新:次のように明示的にTZを指定してデータを入力してみました-

INSERT INTO "test" ("username", "dob") VALUES (E'McCoy', E'1941-01-25 00:20:30+05:30');

それでもうまくいきませんでした。

mydb=> select username, dob from test where username='McCoy';
 username |             dob              
----------+------------------------------
 McCoy    | 1941-01-25 00:43:50+05:53:20
(1 row)
4

3 に答える 3

3

あなたはどの地域にいますか?おそらくPostgreSQLは、日付が現在のロケールのものであると想定しており、適切なタイムゾーンとDSTルールを適用しています.

タイムゾーン機能は本当に必要ですか? Atimestamp without time zoneは奇妙なルールを実装する必要がないため、より健全な動作を示します。ただし、タイムゾーンが必要な場合は、これを修正するのではなく、間違いなく修正する必要があります。

最善の解決策は、タイムゾーンを明示的に指定することです: '04:05:06-08:00'GMT–08:00 の場合、または'04:05:06z'GMT/UTC/"Zulu" (したがって 'z') の場合があります。

編集:本当の奇妙さのほとんどは、アジア/コルカタのタイムゾーンから来ています. からtzdata2009g:

# India
# Zone  NAME        GMTOFF  RULES   FORMAT  [UNTIL]
Zone    Asia/Kolkata    5:53:28 -   LMT 1880    # Kolkata
            5:53:20 -   HMT 1941 Oct    # Howrah Mean Time?
            6:30    -   BURT    1942 May 15 # Burma Time
            5:30    -   IST 1942 Sep
            5:30    1:00    IST 1945 Oct 15
            5:30    -   IST

期待する動作を説明していないため、ここからどこに行きたいかを言うのは困難です。

于 2009-05-14T11:17:17.757 に答える
1

これは夏時間の問題のようです。(私が得た情報によると、タイムゾーンはUTC + 05.30で、DSTは3月/ 4月頃に設定され、1時間が追加されます).

同じ日付を挿入して、その可能性を排除するために年を変更してみましたか?

その最後のものは、それは奇妙です。再現できませんでしたが、30 分ゾーンが原因である可能性があります。TZ環境変数を変更しても同じですか?

于 2009-05-14T11:06:05.990 に答える
0

似ているが異なる問題が1つあります。WinXPにPostgreSQL8.0をインストールしています。

  1. 列の 1 つは、TimeZone の TimeStamp 型です。この列の時刻の値は、システムのタイム ゾーンの変更に伴い変化します。これを避けることはできますか?
  2. テーブルから取得するたびに、タプルごとに 30 分がこの列に到達します。

この問題の原因を突き止めることができませんでした。


rgds nithin

于 2009-08-04T08:31:17.340 に答える