在PostgreSQL中:我使用string
将timestamp
转换为to_timestamp()
:
select * from ms_secondaryhealthcarearea
where to_timestamp((COALESCE(update_datetime, '19900101010101'),'YYYYMMDDHH24MISS')
> to_timestamp('20121128191843','YYYYMMDDHH24MISS')
但是我收到了这个错误:
ERROR: syntax error at end of input
LINE 1: ...H24MISS') >to_timestamp('20121128191843','YYYYMMDDHH24MISS')
^
********** Error **********
ERROR: syntax error at end of input
SQL state: 42601
Character: 176
为什么呢?如何将string
转换为timestamp
?
答案 0 :(得分:7)
一个太多的开口括号。试试这个:
select *
from ms_secondaryhealthcarearea
where to_timestamp(COALESCE(update_datetime, '19900101010101'),'YYYYMMDDHH24MISS') >to_timestamp('20121128191843','YYYYMMDDHH24MISS')
在to_timestamp处有两个左括号:
where to_timestamp((COA.. -- <-- the second one is not needed!
答案 1 :(得分:6)
@ppeterka指出了语法错误。
更迫切的问题是:为什么要将timestamp
数据存储为字符串?如果您的情况允许,请考虑将列转换为正确的类型:
ALTER TABLE ms_secondaryhealthcarearea
ALTER COLUMN update_datetime TYPE timestamp
USING to_timestamp(update_datetime,'YYYYMMDDHH24MISS');
或使用timestamptz
- 取决于您的要求。
答案 2 :(得分:0)
将字符串转换为时间戳类型PostgreSql的另一种方法是上面的
SELECT to_timestamp('23-11-1986 06:30:00', 'DD-MM-YYYY hh24:mi:ss')::timestamp without time zone;
答案 3 :(得分:0)
我和阅读标题的要求相同。如何将纪元时间戳作为文本转换为实时时间戳。在我的例子中,我从json对象中提取了一个。所以我最终得到一个时间戳作为文本,毫秒
'1528446110978'
(格林尼治标准时间:2018年6月8日星期五8:21:50.978 AM)
这就是我尝试过的。只是后者(ts_ok_with_ms)是完全正确的。
SELECT
data->>'expiration' AS expiration,
pg_typeof(data->>'expiration'),
-- to_timestamp(data->>'expiration'), < ERROR: function to_timestamp(text) does not exist
to_timestamp(
(data->>'expiration')::int8
) AS ts_wrong,
to_timestamp(
LEFT(
data->>'expiration',
10
)::int8
) AS ts_ok,
to_timestamp(
LEFT(
data->>'expiration',
10
)::int8
) + (
CASE
WHEN LENGTH(data->>'expiration') = 13
THEN RIGHT(data->>'expiration', 3) ELSE '0'
END||' ms')::interval AS ts_ok_with_ms
FROM (
SELECT '{"expiration": 1528446110978}'::json AS data
) dummy
这是返回的(转置)记录:
expiration 1528446110978
pg_typeof text
ts_wrong 50404-07-12 12:09:37.999872+00
ts_ok 2018-06-08 08:21:50+00
ts_ok_with_ms 2018-06-08 08:21:50.978+00
我确定我忽略了一个更简单的版本,如何从json对象中的时间戳字符串到ms(ts_ok_with_ms)的实时时间戳,但我希望这仍然有用。
更新:这是一个方便的功能。
CREATE OR REPLACE FUNCTION data.timestamp_from_text(ts text)
RETURNS timestamptz
LANGUAGE SQL AS
$$
SELECT to_timestamp(LEFT(ts, 10)::int8) +
(
CASE
WHEN LENGTH(ts) = 13
THEN RIGHT(ts, 3) ELSE '0'
END||' ms'
)::interval
$$;