我有一个日期字段,它只是文本,还有一个显示午夜以来秒数的字段。
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
答案 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
用于微秒。
从字符串转换为
timestamp
,毫秒(MS
)或 微秒(US
)值用作之后的秒数 小数点。例如to_timestamp('12:3', 'SS:MS')
不是3 毫秒,但300,因为转换将其计为12 + 0.3 秒。对于格式SS:MS
,这意味着输入值12:3
,12:30
和12: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格式 - 或者我认为。