Как определить неверные даты в поле таблицы postgres? - PullRequest
0 голосов
/ 18 сентября 2018

У меня есть таблица в PostgreSQL, в которой есть два поля даты (начало и конец).Есть много недействительных дат, оба поля даты, такие как 0988-08-11,4987-09-11 и т. Д. Есть ли простой запрос для их идентификации?Тип данных поля - ДАТА.Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 18 сентября 2018

Значения в столбце даты ARE действительны для определения.Год 0988 = 988 является действительной исторической датой, а также год 4987, который далек от будущего.

Чтобы отфильтровать даты, которые являются слишком историческими или слишком отдаленными в будущем, вы просто делаете этот запрос:

SELECT 
    date_col        
FROM
    table
WHERE 
       date_col < /* <MINIMUM DATE> */ 
    OR date_col > /* <MAXIMUM DATE> */

Для диапазонов дат (минимальная и максимальная даты) вы можетеиспользовать функциональность диапазона дат:

Пример таблицы :

start_date    end_date
2015-01-01    2017-01-01   -- valid
 200-01-01     900-01-01   -- completely too early
3000-01-01    4000-01-01   -- completely too late
0200-01-01    2000-01-01   -- begin too early
2000-01-01    4000-01-01   -- end too late
 200-01-01    4000-01-01   -- begin too early, end too late

Запрос :

SELECT 
    start_date, 
    end_date 
FROM 
    dates 
WHERE 
    daterange('1900-01-01', '2100-01-01') @> daterange(start_date, end_date)

Результат :

start_date    end_date
2015-01-01    2017-01-01

Демонстрация: db <> Fiddle

0 голосов
/ 18 сентября 2018

Это действительные даты, но если у вас есть бизнес-правила, в которых говорится, что они недействительны для вашей цели, вы можете удалить их на основе этих правил:

Например, если вы не хотите, чтобы датыдо 1900 года или после 2999 года этот оператор будет удалять записи с такими датами:

DELETE FROM mytable
WHERE
    start_date < '1900-01-01'::DATE OR
    start_date >= '2999-01-01'::DATE OR
    end_date < '1900-01-01'::DATE OR
    end_date >= '2999-01-01'::DATE;

Если вы хотите заменить даты на самые низкие / самые приемлемые даты вместо удаления всей записи, вы можете сделатькак то так:

UPDATE mytable
SET
    start_date = least('2999-01-01'::DATE, greatest('1900-01-01'::DATE, start_date)),
    end_date = least('2999-01-01'::DATE, greatest('1900-01-01'::DATE, end_date))
WHERE
    start_date < '1900-01-01'::DATE OR
    start_date >= '2999-01-01'::DATE OR
    end_date < '1900-01-01'::DATE OR
    end_date >= '2999-01-01'::DATE;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...