首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >如何识别postgres表字段中的无效日期?

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

Stack Overflow用户
提问于 2018-09-18 18:39:58
回答 2查看 1.1K关注 0票数 0

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

EN

回答 2

Stack Overflow用户

发布于 2018-09-18 18:54:46

根据定义,日期列中的值是有效的。0988 = 988年是一个有效的历史日期,4987年也是一个有效的历史日期。

要过滤掉太过历史或太久远的日期,只需执行以下查询:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
    date_col        
FROM
    table
WHERE 
       date_col < /* <MINIMUM DATE> */ 
    OR date_col > /* <MAXIMUM DATE> */

对于日期范围(最小日期和最大日期),您可以使用日期范围功能:

示例表

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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

查询

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
SELECT 
    start_date, 
    end_date 
FROM 
    dates 
WHERE 
    daterange('1900-01-01', '2100-01-01') @> daterange(start_date, end_date)

结果

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
start_date    end_date
2015-01-01    2017-01-01

demo:db<>fiddle

票数 1
EN

Stack Overflow用户

发布于 2018-09-18 18:51:56

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

例如,如果您不想要1900之前或2999之后的任何日期,则此语句将删除具有这些日期的记录:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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;

如果您希望用最低/最高可接受日期替换日期,而不是删除整个记录,则可以执行以下操作:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
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
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/52392758

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文