【问题标题】:How do I convert a text column to a timestamp column in PostgreSQL?如何在 PostgreSQL 中将文本列转换为时间戳列?
【发布时间】:2021-06-16 08:53:06
【问题描述】:

我在表 X 中有一个 text 列“A”,我想将其转换为表 Y 中没有时区的 timestamp 列。

如何在 PostgreSQL 中执行这种转换?

输入:表 X

A (text)
2006-08-30 21:30:00
21:30:00

所需输出:表 Y

Output (timestamp)
2006-08-30 21:30:00
21:30:00

【问题讨论】:

  • 使用函数 to_timestamp(): postgresql.org/docs/current/functions-formatting.html 你应该解决真正的问题,不要以错误的数据类型存储数据。
  • 日期是时间戳postgresql.org/docs/13/datatype-datetime.html的必填部分@第二个值的日期是什么?
  • 我们没有得到第二行的日期,我们只有第二行的时间。在表中,我们在同一列中有带时间戳的行以及只有时间的行
  • 您最好提供某个来源的日期值。否则to_timestamp('21:00:00', 'HH24:mi:ss') == 0001-01-01 21:00:00 ..
  • 你不能那样做。时间戳具有日期组件。您要么提供时间组件,要么 Postgres 为您提供一个。

标签: sql postgresql postgresql-9.5


【解决方案1】:

TIME 数据类型本身几乎没有用,它首先出现在 23:00:00 或 01:00:00,没有日期部分您无法分辨。但是,您可以通过两次应用强制转换来获得所需的内容:第一个字符串到时间戳,然后时间戳到时间。使用 Postgres 强制转换运算符 (::) 变成:(参见 demo

select ts_as_string::timestamp::time from table_x;

注意:首先,请注意@FrankHeikens 的评论,并为您的时间戳使用正确的数据类型,不是文本。您几乎可以保证在某些时候有人会在该列中插入一个无效值(可能像“N/A”),并且在您声明它有效之后 Postgres 不会停止它。其次,Postgres 9.5 在 2021 年 2 月达到了end-of-life。您应该更新您的版本。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-08
    • 1970-01-01
    • 2023-01-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多