在 Postgresql 中投射部分日期
Casting partial dates in Postgresql
我有一个包含生日属性的数据集。日期格式为M/D/YYYY
(单个数字表示如5/8/2009),以文本格式存储。现在,我需要将列类型更改为最新。但是,有许多实体(超过可以手动修复的实体)具有部分日期 - 即缺少日期或缺少日期和月份。例如:
"//1935"
"/5/1929"
"/4/1931"
现在,当我应用 to_date(birthdate,'DD/MM/YYYY')
时出现错误,因为 Postgresql 无法解析这些日期。我需要做的是用默认值填充缺失值。例如,"//1935"
和 "/5/1929"
应分别转换为 "1/1/1935"
和 "1/5/1929"
。有没有快速解决这个问题的方法?或者,我需要编写一个正则表达式解析器吗?
CREATE TABLE product
("inputDate" varchar(9))
;
INSERT INTO product
("inputDate")
VALUES
('//1935'),
('/5/1929'),
('/4/1931')
;
SELECT *,
CASE WHEN substr("inputDate", 1, 2) = '//' THEN '1/1/' || substr("inputDate", 3, 10)
WHEN substr("inputDate", 1, 1) = '/' THEN '1/' || substr("inputDate", 2, 10)
ELSE "inputDate"
END as result
FROM Product;
我有一个包含生日属性的数据集。日期格式为M/D/YYYY
(单个数字表示如5/8/2009),以文本格式存储。现在,我需要将列类型更改为最新。但是,有许多实体(超过可以手动修复的实体)具有部分日期 - 即缺少日期或缺少日期和月份。例如:
"//1935"
"/5/1929"
"/4/1931"
现在,当我应用 to_date(birthdate,'DD/MM/YYYY')
时出现错误,因为 Postgresql 无法解析这些日期。我需要做的是用默认值填充缺失值。例如,"//1935"
和 "/5/1929"
应分别转换为 "1/1/1935"
和 "1/5/1929"
。有没有快速解决这个问题的方法?或者,我需要编写一个正则表达式解析器吗?
CREATE TABLE product
("inputDate" varchar(9))
;
INSERT INTO product
("inputDate")
VALUES
('//1935'),
('/5/1929'),
('/4/1931')
;
SELECT *,
CASE WHEN substr("inputDate", 1, 2) = '//' THEN '1/1/' || substr("inputDate", 3, 10)
WHEN substr("inputDate", 1, 1) = '/' THEN '1/' || substr("inputDate", 2, 10)
ELSE "inputDate"
END as result
FROM Product;