10

psql \COPYコマンド(SQL COPYではない)を使用して、.csvファイルからpostgresql9.2データベースにデータをインポートしようとしています。

入力.csvファイルには、タイムスタンプがdd.mm.yyyyhh.mm.ss形式の列が含まれています。

を使用してデータベースの日付スタイルをDMYに設定しました。

set datestyle 'ISO,DMY'

残念ながら、\COPYコマンドを実行すると、次のようになります。

\COPY gc_test.trace(numpoint,easting,northing,altitude,numsats,pdop,timestamp_mes,duration,ttype,h_error,v_error) 
FROM 'C:\data.csv' WITH DELIMITER ';' CSV HEADER ENCODING 'ISO 8859-1'

このエラーが発生します:

エラー:日付/時刻フィールドの値が範囲外です: "16.11.2012 07:10:06"

ヒント:おそらく、別の「日付スタイル」設定が必要です。

コンテキスト:トレースのコピー、行2、列timestamp_mes: "16.11.2012 07:10:06"

日付スタイルの何が問題になっていますか?

4

3 に答える 3

11

サーバーdatestyleの設定をしてみましたか?

SET datestyle = 'ISO,DMY';

psqlメタコマンドを使用して\copyいます。これは、入力ファイルがクライアントに対してローカルであることを意味します。しかし、一致するデータ型への入力を強制する必要があるのは依然としてサーバーです。

\copyより一般的には、サーバー上で呼び出しCOPYてそれに密接に関連するpsqlメタコマンドとは異なり..私は以下に関するマニュアルを引用します\set

注:このコマンドは、SQLコマンドSETとは関係ありません。

于 2012-12-26T15:28:26.663 に答える
4

psql コマンドを適用するときに、同じセッション内で「SET datestyle」を適用するのが難しいことがわかりました。データベース/サーバー全体で日付スタイルを変更すると (インポートのためだけに)、他のユーザーや既存のアプリケーションに副作用が生じる可能性があります。したがって、通常、ロードする前にファイル自体を変更します。

#!/bin/bash 
#
# change from dd.mm.yyyy to yyyy-mm-dd inside the file
# note: regex searches for date columns separated by semicolon (;) 
sed -i 's/;\([0-9][0-9]\)\.\([0-9][0-9]\)\.\([0-9][0-9][0-9][0-9]\);/;\3-\2-\1;/g' myfile
# then import file with date column
psql <connect_string> -c "\COPY mytable FROM 'myfile' ...."
于 2016-03-05T09:02:37.260 に答える
0

使用しているように見える日付スタイルはドイツ語です。PostgreSQL はこの日付スタイルをサポートしています。これを使用してみてください:

SET datestyle TO German;
于 2016-04-26T09:50:22.590 に答える