我在PostgreSQL中有一个表,它有两个日期字段(开始和结束)。有许多无效的日期和日期字段,如0988-08-11,4987-09-11等。有没有简单的查询来识别它们?字段的数据类型为DATE。提前谢谢。
发布于 2018-09-18 18:54:46
根据定义,日期列中的值是有效的。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
发布于 2018-09-18 18:51:56
这些日期是有效日期,但如果您的业务规则声明它们对您的用途无效,则可以根据这些规则删除它们:
例如,如果您不想要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;
https://stackoverflow.com/questions/52392758
复制相似问题