【问题标题】:Importing .csv with timestamp column (dd.mm.yyyy hh.mm.ss) using psql \copy使用 psql \copy 导入带有时间戳列 (dd.mm.yyyy hh.mm.ss) 的 .csv
【发布时间】:2012-12-26 15:14:30
【问题描述】:

我正在尝试使用 psql \COPY 命令(不是 SQL COPY)将数据从 .csv 文件导入到 postgresql 9.2 数据库中。

输入 .csv 文件包含一个带有 dd.mm.yyyy hh.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”

日期样式有什么问题?

【问题讨论】:

    标签: postgresql csv timestamp psql postgresql-9.2


    【解决方案1】:

    您是否尝试过设置datestyle setting of the server

    SET datestyle = 'ISO,DMY';
    

    您正在使用 psql 元命令\copy,这意味着输入文件是客户端本地的。但仍然是服务器必须强制输入匹配的数据类型。

    更一般地说,与 psql 元命令 \copy 不同,它在服务器上调用 COPY 并与之密切相关.. 我引用 the manual concerning \set

    注意:此命令与 SQL 命令 SET 无关。

    【讨论】:

    • 感谢您的帮助。我在 postgresql.conf 文件中手动将配置修改为 datestyle = 'iso, dmy' ,现在导入工作正常。不确定这是否是您的建议。但是,我正在寻找一种使用 psql 命令设置服务器日期样式的方法。
    • 嗯,修改 postgresql.conf 是一种激进的方法。您也可以在运行\copy 之前发出会话中所述的 SQL 命令。然后仅针对该会话更改设置。
    • 我尝试在编辑器中运行set datestyle = 'ISO, DMY'; SQL 命令(在修改 postgresql.conf 文件之前),然后执行 psql \copy,但我得到了与以前相同的错误。
    • @jatobat:这很奇怪。我实际测试过,它在 PostgreSQL 9.1.6 下对我有用。它当然也应该像 9.2 中所宣传的那样工作!
    • 好的,我已经重新启动了一切,将 postgresql.conf 重置为其原始配置 'iso,mdy'。连接到服务器。运行SET datestyle = 'ISO,DMY';,然后运行 ​​\copy 命令。导入工作正常。非常感谢您的帮助。
    【解决方案2】:

    我发现在应用 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' ...."
    

    【讨论】:

      【解决方案3】:

      您使用的日期样式似乎是德语。 PostgreSQL 支持这种日期样式。试试这个:

      SET datestyle TO German;
      

      【讨论】:

        猜你喜欢
        • 2019-02-22
        • 1970-01-01
        • 2015-12-07
        • 1970-01-01
        • 2014-04-22
        • 2016-03-11
        • 2019-06-29
        • 1970-01-01
        • 2017-04-02
        相关资源
        最近更新 更多