Как изменить существующую метку времени в объекте JSONB на другой формат метки времени в Postgresql

#postgresql #postgresql-9.5

Вопрос:

В таблице user_record есть столбец info , который возвращает следующие данные, тогда info как это jsonb столбец.
запрос: Select info from user_record;
Результат:

 {"someId": "XXFUN0123XX", "age": 43, "updatedAt": "2017-02-18 00:00:00"}
 

Теперь вопрос конкретно касается updatedAt поля из ответа json

select info ->> 'updatedAt' from user_record where id='XXFUN0123XX';

Результат: 2017-02-18 00:00:00

Я должен обновить все временные метки updatedAt полей info столбца user_record таблицы в этом формате ->> YYYY-MM-DDTHH:MI:SS 02:00 , поэтому, когда я это сделаю select info ->> 'updatedAt' , я получу такой результат -> > 2017-02-18T00:00:00 02:00 .
Я уже перепробовал несколько способов и прочитал документацию, но не смог найти правильного решения. Ниже приведен один запрос, который я пытался выполнить

 UPDATE user_record SET info = info || jsonb_build_object('updatedAt', 
select to_timestamp(info ->> 'updatedAt','YYYY-MM-DDTHH:MM:SS 02:00') from user_record where id ='XXFUN0123XX')) where id = 'XXFUN0123XX';
 

В приведенном выше запросе я пытаюсь извлечь updatedAt объект json из внутреннего запроса.

Ответ №1:

используйте jsonb_set для внесения изменений в jsonb. и используйте to_char вместо to_timestamp того, как показано ниже:

 update user_record
set info=jsonb_set(info,'{updatedAt}',to_jsonb(to_char((info ->> 'updatedAt')::timestamp,'YYYY-MM-DD"T"HH24:MI:SS 02:00')))

 

ДЕМОНСТРАЦИЯ

Комментарии:

1. Отличный Ответ. Было бы здорово, если бы вы могли добавить некоторые подробности о запросе, как он работает.