如何使用 Oracle SQL 验证 txt 文件中的日期?
Posted
技术标签:
【中文标题】如何使用 Oracle SQL 验证 txt 文件中的日期?【英文标题】:How to validate dates in a txt file using Oracle SQL? 【发布时间】:2015-11-13 00:56:12 【问题描述】:我编写了一个 SQL 脚本,用于处理从来自外部源的逗号分隔、双引号文本文件加载到保存表(通过 sqlldr)中的日期。因此,保持表中列的类型都是 VARCHAR2,无论 txt 文件中的数据类型是什么。这样我就可以对来自外部源的数据执行和记录验证,并在将数据从保留表加载到主表(具有适当类型的列,例如 DATE、NUMBER 等)之前报告问题.)
我有正则表达式验证来检查日期的格式是否为 MM/DD/YYYY,但我需要帮助的是如何使用 SQL 来验证语法正确日期的逻辑有效性,例如闰年以及某个月是30天还是31天。有没有办法使用纯 SQL 做到这一点?数据库是Oracle 11g。
我查看了 Oracle 的 to_date 函数,它似乎非常适合我正在尝试做的事情,但我找不到将其结果放入查询而不是在遇到无效日期时崩溃的方法。 感谢您在此主题上提供的任何帮助。
【问题讨论】:
参见here - 编写一个 pl/sql 函数并在您的查询中调用它。 Return number from Oracle Select statement after parsing date的可能重复 也是***.com/questions/33629479/…的副本 【参考方案1】:您可以创建自己的函数,如果日期有误,则返回 null
create or replace function my_to_date(dt varchar2) return date as
ldt date;
begin
ldt := to_date(dt, 'MM/DD/YYYY');
return ldt;
exception when others then return null;
end;
select my_to_date('01/01/2012') from dual
union all
select my_to_date('33/01/2012') from dual
MY_TO_DATE('01/01/2012')
1 01/01/2012
2
或者您需要创建脚本来在导入后检查您的数据
但也许您可以在导入过程中进行检查?通过to_char(to_date(...)...)
转换?如果你的日期有误 - sqlldr 拒绝记录
sample record
7782, "Clark", "Manager", 7839,06/09/1981, 2572.50,, 10:101
sample control file
LOAD DATA
CHARACTERSET utf16
BYTEORDER little
INFILE ulcase11.dat
REPLACE
INTO TABLE EMP
FIELDS TERMINATED BY X'002c' OPTIONALLY ENCLOSED BY X'0022'
(empno integer external (5), ename, job, mgr,
hiredate DATE(20) "to_char(to_date(:HIREDATE, 'MM/DD/YYYY'),'MM/DD/YYYY')",
sal, comm,
deptno CHAR(5) TERMINATED BY ":",
projno,
loadseq SEQUENCE(MAX,1) )
【讨论】:
以上是关于如何使用 Oracle SQL 验证 txt 文件中的日期?的主要内容,如果未能解决你的问题,请参考以下文章
使用 PL/SQL 将数据从 file.txt 导入 Oracle SQL 表