将VARCHAR值转换为格式化的日期,忽略错误

7 浏览
0 Comments

将VARCHAR值转换为格式化的日期,忽略错误

我有一列包含日期的数据,格式为yyyy-mm-dd。现在我正在运行一个SELECT查询,将该日期转换为dd/mm/yyyy,使用TO_CHAR(dob :: DATE, 'dd/mm/yyyy') AS dob,这个方法运行得很好。现在我遇到的问题是,该列中有一些错误的记录,下面是一个示例表,包含一个正确记录和一个错误记录:

| id | dob |

|----|------------|

| 1 | 2019-12-31 | // 正确记录,返回31/12/2019

| 2 | 31-12-2019 | // 错误记录,返回错误

|----|------------|

在id为2的记录上我得到了以下错误:

ERROR:  date/time field value out of range: "31-12-2019"
HINT:  Perhaps you need a different "datestyle" setting.
SQL state: 22008

我想要的是有条件地检查TO_CHAR(dob :: DATE, 'dd/mm/yyyy')是否正确,如果不正确则直接使用dob,不进行转换。有什么方法可以实现吗?

我使用的是Postges 12

0
0 Comments

问题出现的原因是将日期存储为字符串。如果确保列中所有具有格式YYYY-MM-DD的值都是有效日期,则可以使用LIKE运算符来解决问题:

CASE 
  WHEN dob LIKE '____-__-__' THEN TO_CHAR(dob::DATE, 'dd/mm/yyyy') 
  ELSE dob
END AS dob

0