如何将日期和秒数字段转换为PostgreSQL中的时间戳字段?

时间:2013-12-10 21:12:20

标签: postgresql timestamp

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

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

2 个答案:

答案 0 :(得分:1)

Concatenate将两个字段放在一起,然后使用to_timestamp()

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

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

答案 1 :(得分: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:3,   12: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

迄今为止的普通演员({{1}})是有效的,因为您的日期是标准的ISO 8601格式 - 或者我认为。