проверить значения точного формата или нет в postgres - PullRequest
1 голос
/ 03 апреля 2020

Как проверить значения даты в ожидаемом формате или нет Мне нужно проверить значения даты в формате гггг-мм-дд или нет, если нет, то отобразите статус 0 dob и doj имеют тип данных varchar

Таблица: Emp

Таблица: Emp

eid | ename | dob        | doj
1   | abc   | 1900-01-19 | 2019-02-20
2   | dx    | 1900-29-02 | 2019-04-22
3   | xy    | 1989-10-26 | 2018-27-02
4   |ji     | 2000-23-01 | 2019-29-04

на основе вышеуказанных данных. Я хочу, чтобы формат даты проверки был гггг-мм-дд, если флажок не отображается, как показано ниже:

eid | dobdateformatstatus | dojdateformatstatus
1   | 1                   | 1
2   | 0                   | 1
3   | 1                   | 0
4   | 0                   | 0

Подскажите, пожалуйста, как написать запрос для выполнения этой задачи в PostgreSQL.

1 Ответ

0 голосов
/ 03 апреля 2020

Проверка даты - непростая задача, которую вы не хотите выполнять вручную (вам необходимо учитывать переменное количество дней в месяце, не говоря уже о високосных годах).

К сожалению Postgres не имеет функции try_cast() (как, например, в SQL Server или BigQuery): неудачное приведение является ошибкой.

Один из способов заключается в создании пользовательской функции:

create function try_cast_to_date(p_in text)
returns date 
as $$
begin
    begin
        return $1::date;
    exception 
        when others then return null;
    end;
end;
$$
language plpgsql;

Затем вы можете использовать его в своем запросе:

select 
    eid, 
    ename, 
    (try_cast_to_date(dob) is not null) dobdateformatstatus, 
    (try_cast_to_date(doj) is not null) dojdateformatstatus  
from mytable

Демонстрация на DB Fiddle :

eid | ename | dobdateformatstatus | dojdateformatstatus
--: | :---- | :------------------ | :------------------
  1 | abc   | t                   | t                  
  2 | dx    | f                   | t                  
  3 | xy    | t                   | f                  
  4 | ji    | f                   | f                  
...