我在PostgreSQL中有一个表有两个日期字段(开始和结束)。有许多无效日期,如0988-08-11,4987-09-11等日期字段。是否有一个简单的查询来识别它们?该字段的数据类型为DATE。提前致谢。
这些是有效日期,但如果您的业务规则声明它们不适用于您的目的,您可以根据这些规则删除它们:
例如,如果您不希望在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;
日期列中的值按定义有效。 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