将单独的年,月,日,小时,分钟和第二列集成为单个时间戳列

时间:2012-11-18 13:19:14

标签: postgresql types timestamp

我的数据集包含以空格分隔的单独的年,月,日,小时,分钟和第二列:

+-------------------+
|2007|09|28|21|14|06|
|2007|09|28|21|14|06|
|2007|09|28|21|14|06|
|2007|09|28|21|14|06|
|2007|09|28|21|14|06|
+-------------------+

我想在时间戳数据类型下将它们集成为单个列。 我已经在timestamp数据类型中创建了一个新列,并通过以下代码更新列:

 Update s2
 set dt = year || '-' || month  || '-' || day
               || ' ' || hour  || ':' || min  || ':' || second 

但我遇到了以下错误:

ERROR:  column "dt" is of type timestamp without time zone but expression is of type text
LINE 1:  Update temp set dt= year || '-' || month  || '-' || day  ||...
                             ^
HINT:  You will need to rewrite or cast the expression.

********** Error **********

ERROR: column "dt" is of type timestamp without time zone but expression is of type text
SQL state: 42804
Hint: You will need to rewrite or cast the expression.
Character: 22

此外,我可以通过varchar数据类型预先形成集成。

3 个答案:

答案 0 :(得分:5)

您有解释错误的答案:您需要明确地将text投射到timestamp

但是,正确的解决方案是使用to_timestamp()

UPDATE s2
SET dt = to_timestamp(year || '-' || month  || '-' || day || ' '
                           || hour  || ':' || min  || ':' || second
                     ,'YYYY-MM-DD hh24:mi:ss');

为什么?
普通演员'text'::timestamp取决于日期/时间格式的本地设置,并且可以在一个安装中工作,但是"突然"在另一个PostgreSQL安装中失败。保证给定的语句可以独立于datestyle设置和语言环境。

确切地说,示例中的模式('YYYY-MM-DD hh24:mi:ss')符合ISO 8601(SQL标准),该标准对任何区域设置有效。

答案 1 :(得分:2)

您需要从texttimestamp without time zone的简单演员:

(expression)::timestamp without time zone

例如:

Update s2 set dt = (year || '-' || month  || '-' || day  || ' ' || hour  || ':' || min  || ':' || second)::timestamp without time zone

答案 2 :(得分:1)

表达式的结果

year || '-' || month  || '-' || day || ' ' || hour  || ':' || min  || ':' || second 

不是时间戳,而是纯文本。该错误消息只是告诉您,text类型不适合dt列的类型。

您必须按照以下方式投射完整表达式:

(year || '-' || month  || '-' || day || ' ' || hour  || ':' || min  || ':' || second)::timestamp