web-dev-qa-db-ja.com

おそらく、別の「datestyle」設定が必要です

日付タイプの列order_dateがあるテーブルがあります。

クエリ:

INSERT INTO uni_data_temp(sale_order_item_code, 
            order_date, sale_order_item_status, tracking_number, dispatch_date, 
            user_id) VALUES ('1000932515',  cast('16/05/2015' as date), 'DISPATCHED', 'UNIPAYP1958141', '2015/05/20', '4')

このクエリを実行するとエラーが発生します。

ERROR: date/time field value out of range: "16/05/2015"
SQL state: 22008
Hint: Perhaps you need a different "datestyle" setting.
Character: 380

次に、クエリを変更しました

INSERT INTO uni_data_temp(sale_order_item_code, 
            order_date, sale_order_item_status, tracking_number, dispatch_date, 
            user_id) VALUES ('1000932515',  cast('2015/05/16' as date), 'DISPATCHED', 'UNIPAYP1958141', '2015/05/20', '4')

正常に動作します。

しかし、私の問題は、日付がどのような形式(yyyy/mm/ddまたはdd/mm/yyyy)であってもよいことです。

あらゆる種類の日付形式がシステムデータベースに変換されます。

ありがとうございました

12
YAM

日付に文字列を使用しており、セッション設定を使用して文字列を正しく解釈しています。設定に依存しないように、サポートされている日付リテラルを代わりに使用してください。

PostgreSQL(およびそのことについてのSQL標準)では、DATE 'YYYY-MM-DD'は日付リテラルと見なされ、私が推奨する形式です。だから使う

INSERT INTO uni_data_temp
  ( sale_order_item_code
  , order_date
  , sale_order_item_status
  , tracking_number
  , dispatch_date
  , user_id
  ) 
VALUES 
  ( '1000932515'
  , DATE '2015-05-16'
  , 'DISPATCHED'
  , 'UNIPAYP1958141'
  , DATE '2015-05-20'
  , 4
  );

(PostgreSQLの正しい日付リテラル構文を示してくれたa_horse_with_no_nameに感謝します。)

ただし、日付をどこかから文字列として取得する場合は、対応する形式を適用する必要があります。

TO_DATE('06/05/2015', 'DD/MM/YYYY')
TO_DATE('05/06/2015', 'MM/DD/YYYY')
11