在 oracle 中选择无效的日期字符串
Posted
技术标签:
【中文标题】在 oracle 中选择无效的日期字符串【英文标题】:select invalid date string in oracle 【发布时间】:2016-09-19 12:38:43 【问题描述】:我在数据库表中有一个 nvarchar2
列,它存储表示日期的字符串,例如“2016-12-05”。
有什么方法可以检测不包含有效日期字符串的行,例如'2012-19-34'
?
我想要一个将任何无效日期字符串设置为 null
的语句。
【问题讨论】:
通过将它们存储为date
而不是varchar
?
请发布您到目前为止尝试过的内容;此外,您的列上是否有索引? “最好的”是什么意思?:最快,最易读,...?
“最好”的意思是迄今为止的“任何”。
添加@Siyual,例如,您是如何轻松检查 2 月 29 日的?您可以尝试逐个选择它们并使用to_date
。遇到异常的那些将是无效的。使用date
开头将是最好的选择。
请参阅here,了解使用自定义日期验证器的巧妙解决方案。正如其他人所说,将日期存储为日期,并可能在您的应用层中处理检查。
【参考方案1】:
你可以编写一个函数来尝试将字符串转换为日期:
create function check_date(p_date_str in nvarchar2) return number as
v_result NUMBER(1,0);
v_date DATE;
begin
v_result := 1;
begin
v_date := to_date( p_date_str, 'YYYY-MM-DD');
exception when others then
v_result := 0;
end;
return v_result;
end;
/
然后用它来查找无效记录:
select * from my_table where check_date(column_with_date_as_str) = 0;
【讨论】:
以上是关于在 oracle 中选择无效的日期字符串的主要内容,如果未能解决你的问题,请参考以下文章
将日期附加到字符串以在 oracle 中获取表名并对其进行选择查询
Netezza 如何从 MON DD YYYY hh:mi am 格式的字符中读取日期时间。我得到一个无效的日期