我有一列LossDate以(yyyymmdd)格式保存。我需要验证如果该月在30天内结束,那么没有报告损失日期为31的损失。我有数百万条记录。帮助将不胜感激。
LossDate
yyyymmdd
LossDate -------- 20120128 20150520 20180631
查询应返回最后一个无效记录,因为200806在30天内结束。
对于您的特定问题,以下内容将返回错误的行:
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'