如何在postgres表字段中识别无效日期?

问题描述 投票:0回答:2

我在PostgreSQL中有一个表有两个日期字段(开始和结束)。有许多无效日期,如0988-08-11,4987-09-11等日期字段。是否有一个简单的查询来识别它们?该字段的数据类型为DATE。提前致谢。

postgresql
2个回答
0
投票

这些是有效日期,但如果您的业务规则声明它们不适用于您的目的,您可以根据这些规则删除它们:

例如,如果您不希望在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;

0
投票

日期列中的值按定义有效。 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

demo:db<>fiddle

© www.soinside.com 2019 - 2024. All rights reserved.