在 postgres 中标准化 JSON 中的出生日期

Standardize date of birth in JSON in postgres

我的数据库中混合了各种出生日期。有些格式为 yyyyy-mm-dd,有些格式为 mm:dd:yyyy。我正在尝试计算年龄,这让我很难约会。我怎样才能使日期标准化?

SELECT date_of_birth 
  FROM ( SELECT attrs::JSON->'info'->>'date_of_birth' 
           FROM users ) AS date_of_birth;

date_of_birth      
--------------
 (2000-11-03)
 (2000-06-11)
 (2000-05-31)
 (2008-11-26)
 (2007-11-09)
 (2020-03-26)
 (2018-06-30)
 (02:21:2020)

 (2007-10-09)

只有几个 mm:dd:yyyy 出生日期。我尝试通过

更新 JSON 中的字段
UPDATE users 
   SET attrs::JSON->'info'->>'date_of_birth'='02-21-2020' 
 WHERE attrs::JSON->'info'->>'date_of_birth'='02:21:2020' 

但是出错了

ERROR: syntax error at or near "::"

您可以将 attrs 的数据类型从 JSON 转换为 JSONB

ALTER TABLE users ALTER COLUMN attrs 
  SET DATA TYPE JSONB USING attrs::JSONB

然后,使用JSONB_SET()函数更新相关数据(date_of_birth数据中包含分号),例如

UPDATE users
   SET attrs = JSONB_SET( attrs, '{info,date_of_birth}', 
                          ('"'||TO_DATE(
                                  attrs::JSONB->'info'->>'date_of_birth', 'mm:dd:yyyy'
                                  )::TEXT||'"')::JSONB 
                        )
  WHERE POSITION( ':' IN attrs::JSON->'info'->>'date_of_birth'::TEXT ) > 0

Demo