我的数据集包含以空格分隔的单独的年,月,日,小时,分钟和第二列:
+-------------------+
|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
数据类型预先形成集成。
答案 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)
您需要从text
到timestamp 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