13

timestamp with no timezone dataタイプフィールドに値を挿入するクエリを作成しようとしています。値はCSVファイルから取得されます。

私が使用しているバージョンはPostgreSQL8.1.21です

CSVファイルのアップロードはクライアントによって行われ、日付列があります。日付は、フォーマットとして'28-Sep-13'、場合によっては来ることがあり'28/09/2013'ます。

次を使用して、文字列をタイムスタンプにキャストしようとしました str_date::timestamp

これは、のstr_dateような場合は正常に機能しますが、次のエラーが発生したときに'28-Sep-13'、受信日が次の形式の場合は機能しません。'28/09/2013'

ERROR: date/time field value out of range: "28/09/2013"  
HINT:  Perhaps you need a different "datestyle" setting

基本的に、クライアントはアップロードされたCSVファイルの日付形式を変更し続けます。
実際の形式に応じて、日付文字列をタイムスタンプに変換する方法はありますか?

4

3 に答える 3

17

日付スタイルを「ISO、DMY」に設定する必要があります。デフォルトでは「ISO、MDY」に設定されており、例が失敗する原因になります。

> show datestyle;

 DateStyle 
-----------
 ISO, MDY
(1 row)

> select '28-Sep-13'::date;
    date    
------------
 2013-09-28
(1 row)

> select '28/09/2013'::date;
ERROR:  date/time field value out of range: "28/09/2013"
LINE 1: select '28/09/2013'::date;
               ^
HINT:  Perhaps you need a different "datestyle" setting.

> set datestyle = 'ISO, DMY';
SET

> select '28-Sep-13'::date;
    date    
------------
 2013-09-28
(1 row)

> select '28/09/2013'::date;
    date    
------------
 2013-09-28
(1 row)

(PostgreSQL 9.1で行われた例ですが、DateStyle設定と関連する動作は古いため、正常に機能するはずです)

于 2011-11-15T19:47:05.520 に答える
7

次の手順で問題を回避できます。

  1. ターゲットテーブルと同じ構造の空の一時テーブルを作成します。

    CREATE TEMP TABLE tmp AS SELECT * FROM real_tbl LIMIT 0;
    
  2. 問題のある列のタイプをテキストに変更します。

    ALTER TABLE tmp ALTER COLUMN str_date TYPE text;
    
  3. 一時テーブルにデータをインポートします。今は正常に動作するはずです:

    COPY tmp FROM '/path/to/my/file.txt';
    
  4. INSERT列の実際の内容に応じて、ターゲットテーブルに次のように入力します。

    INSERT INTO real_tbl (col1, col2, col3, date_col)
    SELECT col1, col2, col3
         , CASE WHEN str_date ~~ '%/%'
              THEN to_date(str_date, 'DD/MM/YYYY')
           WHEN str_date ~~ '%-%'
              THEN to_date(str_date, 'DD-Mon-YYYY')
            -- more cases?
           ELSE ???
           END AS date_col
    FROM   tmp;
    
    -- DROP TABLE tmp;  -- optional; dropped at end of session automatically
    
于 2011-11-15T02:20:16.753 に答える
1

Erwinに同意しますが、さまざまな日付文字列をに変換できるデータベース関数(PL / pgSQL、PL / Python、またはその他の言語)を作成してみますdate。アーウィンズの答えでは、あなたはそれを見ることができWHEN ... THEN、あなたはそれを使うことができます。このような機能は、テストと保守が容易になります。

于 2011-11-15T09:12:57.170 に答える