我目前正在进行查询,其中有一个包含列
的表格--------------------------------------------------------------------------------
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中不起作用。还有其他选择吗?
答案 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