如何在Postgres中更新epoch中当前时间的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

我需要用历元中的当前时间更新“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';
我得到“类型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';