将文本时间戳转换为数据类型时间戳 - PSQL

时间:2017-11-09 20:31:29

标签: postgresql

我有一个表,其中所有列都是text类型,有一个名为created的列,另一个名为modified。

它们都有时区的时间戳,但是是数据类型的文本。

enter image description here

我需要将这两列都转换为时间戳,但我已经读过,因为PSQL不允许,所以没有办法只是“强制转换”到时间戳。

有任何想法可以解决这个问题吗?我一直在尝试这个:

to_timestamp(created) as created_user,
to_timestamp(modified) as modified_user,

但它会引发语法错误。

ERROR:  column "2017-02-22 16:30:06.79156 UTC" does not exist
LINE 1: SELECT to_timestamp("2017-02-22 16:30:06.79156 UTC")

任何想法我可能做错了吗?

1 个答案:

答案 0 :(得分:0)

我相信这是你调用to_timestamp()的方式,需要2个参数:

   CREATE TABLE Table1
        ("created" varchar(30), "modified" varchar(30))
    ;

    INSERT INTO Table1
        ("created", "modified")
    VALUES
        ('2017-02-22 16:30:06.79156 UTC', '2017-10-11 15:30:06.79156 UTC'),
        ('2017-04-21 16:30:06.79156 UTC', '2017-10-11 15:30:06.79156 UTC'),
        ('2017-04-19 16:30:06.79156 UTC', '2017-10-11 15:30:06.79156 UTC'),
        ('2017-05-23 16:30:06.79156 UTC', '2017-10-11 15:30:06.79156 UTC')
    ;

快捷方法有效,函数to_timestamp(text,text)也可以工作,例如。

select
      created::timestamptz
    , modified::timestamptz
from table1;

select
      to_timestamp(created,'YYYY-MM-DD HH24:MI:SS.US')
    , to_timestamp(modified,'YYYY-MM-DD HH24:MI:SS.US')
from table1;

|                    created |                   modified |
|----------------------------|----------------------------|
| 2017-02-22T16:30:06.79156Z | 2017-10-11T15:30:06.79156Z |
| 2017-04-21T16:30:06.79156Z | 2017-10-11T15:30:06.79156Z |
| 2017-04-19T16:30:06.79156Z | 2017-10-11T15:30:06.79156Z |
| 2017-05-23T16:30:06.79156Z | 2017-10-11T15:30:06.79156Z |

但没有第二个参数的to_timestamp()失败:

select
      to_timestamp(created)
    , to_timestamp(modified)
from table1
;
  

错误:函数to_timestamp(字符变化)不存在提示:   没有函数匹配给定的名称和参数类型。你可能需要   添加显式类型转换。位置:15