4

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

+-------------------+
|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|
+-------------------+

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

 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数据类型进行集成。

4

3 回答 3

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 标准),这对任何语言环境都有效。

于 2012-11-18T13:55:07.067 回答
2

您需要从textto 进行简单的转换timestamp without time zone

(expression)::timestamp without time zone

例如:

Update s2 set dt = (year || '-' || month  || '-' || day  || ' ' || hour  || ':' || min  || ':' || second)::timestamp without time zone
于 2012-11-18T13:47:09.290 回答
1

表达式的结果

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

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

您必须像这样转换完整的表达式:

(year || '-' || month  || '-' || day || ' ' || hour  || ':' || min  || ':' || second)::timestamp
于 2012-11-18T13:48:55.080 回答