Преобразовать значение VARCHAR в форматированную дату, игнорируя ошибки - PullRequest
0 голосов
/ 20 марта 2020

У меня есть столбец, содержащий даты в формате 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
|----|------------|

Ошибка, которую я получаю для идентификатора 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

Ответы [ 2 ]

1 голос
/ 20 марта 2020

Не рекомендуется хранить даты в виде строк, и ваша проблема это доказывает. Если вы уверены, что все значения в этом столбце в формате YYYY-MM-DD являются действительными датами , используйте оператор LIKE:

CASE 
  WHEN dob LIKE '____-__-__' THEN TO_CHAR(dob::DATE, 'dd/mm/yyyy') 
  ELSE dob
END AS dob
0 голосов
/ 20 марта 2020

Мне удалось решить эту проблему, создав функцию, аналогичную выбранному ответу в ссылке, размещенной @a_horse_with_no_name> обновить столбец vachar до даты в 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 $$;

Таким образом, SELECT отформатирует хорошие записи по желанию и проигнорирует плохие записи.

SELECT id, format_date_or_return_string(dob) из примеров данных в вопросе вернет:

| 1 | 31/12/2019 | // good record
| 2 | 31-12-2019 | // ignored bad record
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...