一尘不染

SQL中的有效日期验证

sql

我有一列LossDate以(yyyymmdd)格式保存。我需要验证如果该月在30天内结束,那么没有报告损失日期为31的损失。我有数百万条记录。帮助将不胜感激。

LossDate
--------
20120128
20150520
20180631

查询应返回最后一个无效记录,因为200806在30天内结束。


阅读 194

收藏
2021-05-05

共1个答案

一尘不染

对于您的特定问题,以下内容将返回错误的行:

select * 
from table 
where substr(lossdate,5,2) in ('04','06','09','11')
    and substr(lossdate,7,2) > '30'

根据您的输入界面,您可能需要重复31个月的几个月,以显示大于31的值。

select * 
from table 
where substr(lossdate,5,2) in ('01','03','07','08','10','12')  
    and substr(lossdate,7,2) > '31'

2月有点棘手。逐步开始,确定超过29天的所有2月条目,您可以立即删除/修复这些条目。

select * 
from table 
where substr(lossdate,5,2) = '02' 
    and substr(lossdate,7,2) > '29'

然后,您需要对2月日期大于28且不是a年的其余行重复此操作。在过去的100年中,任何可被4整除的年份都是a年,因此您可以使用此标识剩余的年份(假设您已更正/删除了已经发现的不良Feb条目):

select * 
from table 
where substr(lossdate,5,2) = '02' 
    and mod(substr(lossdate,1,4),4)) <> 0 
    and substr(lossdate,7,2) > '28'
2021-05-05