在 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 中获取表名并对其进行选择查询

在Oracle使用sql语句中如何插入日期格式的数据

Netezza 如何从 MON DD YYYY hh:mi am 格式的字符中读取日期时间。我得到一个无效的日期

Oracle - 都获取 XML 日期字符串并将其转换为日期

从 VARCHAR 字符串中提取日期 ORacle

MyBatis+Oracle Date转String