在 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
我的数据库中混合了各种出生日期。有些格式为 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
出生日期。我尝试通过
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