检查hire_date的格式是否为(DD-MMM-YYYY)?

时间:2018-06-05 12:48:34

标签: sql oracle

我目前正在进行查询,其中有一个包含列

的表格
--------------------------------------------------------------------------------
EID(number)                ENAME(varchar2)                  HIRE_DATE(varchar2)
101                        PaulJones                        20120104
102                        DavidSmith                       27-JAN-1995
103                        BellaSwan                        15May2020 05:30:00

Expected Output :
EID        ENAME             HIRE_DATE           VALID_DATE
101        PaulJones         20120104               False
102        DavidSmith        27-JAN-1995            True
103        BellaSwan         15May2020 05:30:00     False  

所以David在Valid_date列上的确如此,因为他的hire_date与ORACLE date()函数的默认格式匹配。

我试图使用:

SELECT EID, ENAME, 
(CASE 
WHEN ISDATE(HIRE_DATE)=1 THEN 'TRUE'
ELSE 'FALSE'
END) AS VALID_DATE
FROM EMP_INFO2;

错误:

  

ISDATE()无效的标识符。

我认为这个功能在Oracle中不起作用。还有其他选择吗?

2 个答案:

答案 0 :(得分:1)

您可以编写自己的isDate函数(根据需要调整格式)

CREATE OR REPLACE FUNCTION isDate( p_date_str IN VARCHAR2 )
  RETURN VARCHAR2
IS
  l_date DATE;
BEGIN
  l_date := to_date( p_date_str, 'DD-MON-YYYY' );
  RETURN 'TRUE';
EXCEPTION
  WHEN others THEN
    RETURN 'FALSE';
END isDate;

您的查询很简单:

SELECT EID, ENAME, ISDATE(HIRE_DATE) AS VALID_DATE
FROM EMP_INFO2;

答案 1 :(得分:0)

专栏列是否有多种格式的日期?这将需要更复杂的代码

CREATE OR REPLACE FUNCTION isdate (pdate VARCHAR2) RETURN NUMBER 
IS
  FUNCTION try_format(pformat VARCHAR2) RETURN BOOLEAN IS
    l_date DATE;
  BEGIN
    l_date := TO_DATE(pdate, pformat);
    RETURN TRUE;
  EXCEPTION WHEN OTHERS THEN 
    RETURN FALSE;
  END try_format;
BEGIN 
  IF try_format('YYYYDDMM') 
  OR try_format('DD-MON-YYYY') 
  OR try_format('DDMONYYYY HH24:MI:SS')
     THEN RETURN 1; 
     ELSE RETURN 0; 
  END IF;
END isdate;
/

CREATE TABLE emp_info (eid NUMBER, hire_date VARCHAR2(30));
INSERT INTO  emp_info VALUES (101,'20120104');
INSERT INTO  emp_info VALUES (102,'27-JAN-1995');
INSERT INTO  emp_info VALUES (103,'15May2020 05:30:00');

SELECT eid, isdate(hire_date) AS valid_date FROM emp_info;

EID  VALID_DATE
101  1
102  1

但是我建议将列hire_date的数据类型更改为DATE,或者,如果不可能,则至少为valid_date添加新列。 103 1