如何在Postgres中更新epoch中当前时间的json对象
我需要用历元中的当前时间更新“lastUpdated”字段的json对象。我正在做以下工作,但失败了:如何在Postgres中更新epoch中当前时间的json对象,json,postgresql,sql-update,jsonb,Json,Postgresql,Sql Update,Jsonb,我需要用历元中的当前时间更新“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 || '{"last
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';
我得到“类型json的输入语法无效”
请注意,当我设置自定义纪元时间时,以下功能有效:
UPDATE data SET data = data || '{"dateAdded":1447502107000 , "lastUpdated":1447502107000}' WHERE dtype='Employee' and data->>'id' = '1234';
首先,您应该将列
data
的数据类型更改为jsonb
,这不适用于json
alter table data alter data type jsonb;
然后使用函数jsonb\u build\u object()
:
如果不想更改柱类型,则必须使用铸造:
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是一个函数,在“”中使用它基本上就是发送一个字符串,返回时间戳
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):
谢谢。我已经编辑了我的帖子。事实上,当我设置一个自定义的历元时间时,查询确实可以工作,即| |操作符与json一起工作。尽管如此,我尝试了您的上一个查询,它仍然有效,但当我在字段中看到数据时,它是1533558723.808。我能去掉小数点吗。我需要它是1533558723808。事实上,当我设置一个自定义的纪元时间时,查询确实起作用,即| |运算符与json一起工作-我认为我们使用的是不同的Postgres。是的,我的错。我刚查了一下表格说明。数据字段实际上是jsonb。谢谢你指出。你能告诉我如何摆脱这种精确性吗?我尝试使用extract(epoch from current_timestamp)*1000,但它在小数点后的末尾追加了另外两个数字。
UPDATE data SET data = data || '{"dateAdded":1447502107000 ,
"lastUpdated":1447502107000}' WHERE dtype='Employee' and data->>'id' = '1234';
UPDATE data SET data = data || '{"lastUpdated":' || extract(epoch from
current_timestamp)::text || '}'
WHERE dtype='Employee' and data->>'id' = '1234';