在varchar2中搜索一种格式?

时间:2015-12-15 20:35:38

标签: sql oracle sql-like

如何查询varchar2的格式?示例是Varchar2字段,其中包含日期为mm / dd / yyyy&01:01/01/20'。我怎样才能找到一个写成yyyy / mm / dd' 2015/01/01'因为我不知道格式错误的日期所以我无法真正搜索它。我只想写public void percentageChanged(int percs) { Invoke(new Action(() => { progressBar1.Value = percs; })); } ,但这显然不起作用。

2 个答案:

答案 0 :(得分:3)

当然,如果你使用正则表达式,你想要做的是什么:

where regexp_like(field_1, '^[0-9]{4}/[0-9]{2}/[0-9]{2}$')

作为旁注:您不应该将数据库中的日期存储为字符串。你应该使用日期。

答案 1 :(得分:1)

戈登的回答可能已经足够满足您的需求了,但是他给你的正则表达式可能会匹配像9999/99/99这样不是日期的东西。

如果你真的需要匹配日期 - 如果日期是VARCHAR2的整个值而不仅仅是嵌入在其中 - 那么函数可以提供帮助。

在下面的示例中,我创建了一个名为safe_to_date的函数,如果给定的VARCHAR2值不是指定格式的日期,则返回NULL。

CREATE OR REPLACE FUNCTION safe_to_date ( p_string VARCHAR2 ) RETURN DATE IS
BEGIN
  RETURN to_date(p_string,'YYYY/MM/DD');
EXCEPTION
  WHEN others THEN
    RETURN NULL;
END;


with my_table AS 
 ( SELECT '9999/99/99' /*invalid*/ my_column FROM dual UNION ALL
   SELECT '2015/12/25' from dual UNION ALL
   SELECT 'not a date at all' /*invalid*/ FROM dual UNION ALL
   SELECT '11-NOV-1917' from dual UNION ALL
   SELECT '2015*DEC*25' from dual UNION ALL
   SELECT '2015/02/28' from dual UNION ALL
   SELECT '2015/02/29' /*invalid*/ from dual)
SELECT *
FROM   my_table
WHERE  safe_to_date(my_column) IS NOT NULL;

预期结果:

25-DEC-2015
11-NOV-1917
25-DEC-2015
28-FEB-2015