-1

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

| id |    dob     |
|----|------------|
|  1 | 2019-12-31 | // this returns 31/12/2019
|  2 | 31-12-2019 | // BAD RECORD, this returns an error
|----|------------|

我在 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

4

2 回答 2

1

将日期存储为字符串不是一个好习惯,您的问题证明了这一点。
如果您确定此列中具有该格式的所有值YYYY-MM-DD都是有效日期,则使用运算符LIKE

CASE 
  WHEN dob LIKE '____-__-__' THEN TO_CHAR(dob::DATE, 'dd/mm/yyyy') 
  ELSE dob
END AS dob
于 2020-03-20T08:21:29.600 回答
0

我能够通过在 @a_horse_with_no_name > update vachar column to date in postgreSQL发布的链接中创建一个类似于所选答案的函数来解决这个问题。功能:

create or replace function format_date_or_return_string(str varchar)
returns text language plpgsql as $$
begin
    return to_char(to_date(str, 'yyyy-mm-dd), 'dd-mm-yyyy');
exception
    when others then return str;
end $$;

因此,aSELECT将根据需要格式化好记录并忽略坏记录。

SELECT id, format_date_or_return_string(dob)从问题中的样本数据将返回:

| 1 | 31/12/2019 | // good record
| 2 | 31-12-2019 | // ignored bad record
于 2020-03-20T10:19:57.500 回答