【问题标题】:How do I convert date and seconds fields to a timestamp field in PostgreSQL?如何在 PostgreSQL 中将日期和秒字段转换为时间戳字段?
【发布时间】:2013-12-10 21:12:20
【问题描述】:

我有一个日期字段,它只是文本,还有一个显示自午夜以来的秒数的字段。

CREATE TABLE t ("s" text, "d" text, "ts" timestamp)
;   
INSERT INTO t ("s", "d")
VALUES
    (24855, 20130604),
    (24937.7, 20130604)
;

如何将这些字段转换为时间戳,以便运行基于时间的查询?

查看使用 SQL Fiddle 的演示: http://sqlfiddle.com/#!15/67018/2

【问题讨论】:

    标签: postgresql timestamp


    【解决方案1】:

    由于您的数据包含小数秒,您需要针对这些进行调整:

    UPDATE t
    SET    ts = to_timestamp(d||s, 'YYYYMMDDSSSS.MS');

    假设以毫秒为最大精度。否则使用US 微秒。

    考虑fine print in the manual

    在从字符串到 timestamp 的转换中,毫秒 (MS) 或 微秒 (US) 值用作 小数点。例如to_timestamp('12:3', 'SS:MS') 不是 3 毫秒,但 300,因为转换将其计为 12 + 0.3 秒。这意味着对于格式SS:MS,输入值12:312:3012:300 指定相同的毫秒数。要得到 三毫秒,必须使用12:003,这是转换计数 为 12 + 0.003 = 12.003 秒。

    还要注意to_timestamp() 返回timestamp with time zone,在更新的上下文中它被强制转换为timestamp,结果没问题。对于其他上下文,您可能希望显式强制转换或使用此替代方法,产生timestamp

    SELECT d::date + interval '1s' * s::numeric AS ts FROM t;
    

    简单的日期转换 (d::date) 有效,因为您的日期采用标准 ISO 8601 格式 - 或者我认为是这样。

    【讨论】:

    • 感谢您提供更完整的答案。在我注意到操作顺序之前,我眯着眼睛看了你的 SELECT 语句一分钟,这意味着在添加到日期之前,1 秒将乘以秒。是的?加上括号,我会觉得更安全。
    • @MartinBurch:是的,这是由 operator precedence 规定的。为了清楚起见,您可以添加括号,但表达式按原样有效。
    【解决方案2】:

    Concatenate两个字段一起用to_timestamp()

    UPDATE t SET ts = to_timestamp(d||s, 'YYYYMMDDSSSS');

    有关 to_timestamp 中使用的格式化字符串的讨论,请参阅 PostgreSQL 文档中的 Table 9-21: Template Patterns for Date/Time Formatting

    【讨论】:

      猜你喜欢
      • 2020-03-23
      • 1970-01-01
      • 1970-01-01
      • 2019-07-21
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多