如何在 Postgres 中为当前时间更新 json 对象
How to update json object in Postgres for current time in epoch
我需要用 Epoch 中的当前时间更新 'lastUpdated' 字段的 json 对象。我正在执行以下操作但失败了:
UPDATE data SET data = data || '{"lastUpdated": extract(epoch from current_timestamp) }'
WHERE dtype='Employee' and data->>'id' = '1234';
以下内容本身不起作用:
UPDATE data SET data = data || '{"lastUpdated": current_timestamp }'
WHERE dtype='Employee' and data->>'id' = '1234';
我得到 'invalid input syntax for type json'。
请注意,当我设置自定义纪元时间时,以下内容有效:
UPDATE data SET data = data || '{"dateAdded":1447502107000 , "lastUpdated":1447502107000}' WHERE dtype='Employee' and data->>'id' = '1234';
首先,您应该将列 data
的数据类型更改为 jsonb
,因为 the concatenation operator ||
不适用于 json
。
alter table data alter data type jsonb;
然后使用函数jsonb_build_object()
:
UPDATE data SET data = data || jsonb_build_object('lastUpdated', extract(epoch from current_timestamp))
WHERE dtype='Employee' and data->>'id' = '1234';
如果不想更改列类型,则必须使用转换:
UPDATE data SET data = data::jsonb || jsonb_build_object('lastUpdated', extract(epoch from current_timestamp))
WHERE dtype='Employee' and data->>'id' = '1234';
更新
选择两个变体之一进行舍入或去除时间戳的精度:
select
extract(epoch from current_timestamp),
replace(extract(epoch from current_timestamp::timestamp(3))::text, '.', ''),
concat(extract(epoch from current_timestamp::timestamp(0))::text, '000')
date_part | replace | concat
------------------+---------------+---------------
1533560841.14562 | 1533568041146 | 1533568041000
(1 row)
或者:
select
extract(epoch from current_timestamp),
extract(epoch from current_timestamp(3))* 1000 as v1,
extract(epoch from current_timestamp(0))* 1000 as v2
这是行不通的,因为 extract 是一个函数,通过在 '' 中使用它,您基本上是在发送一个字符串,returns 时间戳
UPDATE data SET data = data || '{"lastUpdated": extract(epoch from
current_timestamp) }'
WHERE dtype='Employee' and data->>'id' = '1234';
与此同时,这是可行的,因为您存储的方式是存储的方式
UPDATE data SET data = data || '{"dateAdded":1447502107000 ,
"lastUpdated":1447502107000}' WHERE dtype='Employee' and data->>'id' = '1234';
虽然我会说尝试Klin的方式,但你所问的解决方案也可以(确保将数据类型更改为JSONB):
UPDATE data SET data = data || '{"lastUpdated":' || extract(epoch from
current_timestamp)::text || '}'
WHERE dtype='Employee' and data->>'id' = '1234';
我需要用 Epoch 中的当前时间更新 'lastUpdated' 字段的 json 对象。我正在执行以下操作但失败了:
UPDATE data SET data = data || '{"lastUpdated": extract(epoch from current_timestamp) }'
WHERE dtype='Employee' and data->>'id' = '1234';
以下内容本身不起作用:
UPDATE data SET data = data || '{"lastUpdated": current_timestamp }'
WHERE dtype='Employee' and data->>'id' = '1234';
我得到 'invalid input syntax for type json'。
请注意,当我设置自定义纪元时间时,以下内容有效:
UPDATE data SET data = data || '{"dateAdded":1447502107000 , "lastUpdated":1447502107000}' WHERE dtype='Employee' and data->>'id' = '1234';
首先,您应该将列 data
的数据类型更改为 jsonb
,因为 the concatenation operator ||
不适用于 json
。
alter table data alter data type jsonb;
然后使用函数jsonb_build_object()
:
UPDATE data SET data = data || jsonb_build_object('lastUpdated', extract(epoch from current_timestamp))
WHERE dtype='Employee' and data->>'id' = '1234';
如果不想更改列类型,则必须使用转换:
UPDATE data SET data = data::jsonb || jsonb_build_object('lastUpdated', extract(epoch from current_timestamp))
WHERE dtype='Employee' and data->>'id' = '1234';
更新
选择两个变体之一进行舍入或去除时间戳的精度:
select
extract(epoch from current_timestamp),
replace(extract(epoch from current_timestamp::timestamp(3))::text, '.', ''),
concat(extract(epoch from current_timestamp::timestamp(0))::text, '000')
date_part | replace | concat
------------------+---------------+---------------
1533560841.14562 | 1533568041146 | 1533568041000
(1 row)
或者:
select
extract(epoch from current_timestamp),
extract(epoch from current_timestamp(3))* 1000 as v1,
extract(epoch from current_timestamp(0))* 1000 as v2
这是行不通的,因为 extract 是一个函数,通过在 '' 中使用它,您基本上是在发送一个字符串,returns 时间戳
UPDATE data SET data = data || '{"lastUpdated": extract(epoch from
current_timestamp) }'
WHERE dtype='Employee' and data->>'id' = '1234';
与此同时,这是可行的,因为您存储的方式是存储的方式
UPDATE data SET data = data || '{"dateAdded":1447502107000 ,
"lastUpdated":1447502107000}' WHERE dtype='Employee' and data->>'id' = '1234';
虽然我会说尝试Klin的方式,但你所问的解决方案也可以(确保将数据类型更改为JSONB):
UPDATE data SET data = data || '{"lastUpdated":' || extract(epoch from
current_timestamp)::text || '}'
WHERE dtype='Employee' and data->>'id' = '1234';