检查hire_date 的格式是不是为(DD-MMM-YYYY)? [复制]
Posted
技术标签:
【中文标题】检查hire_date 的格式是不是为(DD-MMM-YYYY)? [复制]【英文标题】:Check if hire_date is in format of (DD-MMM-YYYY)? [duplicate]检查hire_date 的格式是否为(DD-MMM-YYYY)? [复制] 【发布时间】:2018-06-05 12:48:34 【问题描述】:我目前正在处理一个查询,其中我有一个包含列的表
--------------------------------------------------------------------------------
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 列上为 true,因为他的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 中不起作用。还有其他选择吗?
【问题讨论】:
你强制使用英文月份名称吗? 实际上在 oracle 中,如果您将任何列设置为“雇用日期”,数据类型为“日期”。它将将该列的值设为“2018 年 1 月 27 日”,而不是“27-01-2018”。当我尝试时它显示错误。 在varchar
列中存储日期是一个真的,非常糟糕的主意。如果您将其定义为DATE
,您现在就不会遇到问题
@AkanshaKaushik Oracle 不一定会采用任何特定格式,例如 '27-Jan-2018'
,它会使用您指定的格式,或者 nls_date_format
和 nls_date_language
(它们本身默认来自 nls_territory
)如果您不。如果您使用 PL/SQL Developer 或 Toad 等桌面工具,它们有自己的默认设置(或使用 Windows 桌面设置),这些设置可能与数据库默认设置不同。永远不要假设日期格式,它可以是任何东西。
我不确定 oracle 使用的所有不同数据类型或默认数据类型格式。我是这个 SQL 的新手。到目前为止,我所经历的只是,如果我为例如定义一个列,我正在使用 SQL 开发人员。当我在表中插入行时,生日为日期。对于 Birthdate,它采用“27-Jan-1995”格式的日期。如果我尝试 27/01/1995 或 27January1995。它会向我显示错误。
【参考方案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;
【讨论】:
您好,谢谢您的回答。该功能正在运行,但输出错误。 DavidSmith 应该是这样。但对所有人来说都是错误的。您能否为我解释一下这一行“l_date := to_date(p_date_str, 'DD-MON-YYYY');”从功能上。 ? 它尝试使用“DD-MON-YYYY”格式将字符串转换为日期。成功时它转到下一行并返回 true。如果输入由于格式不正确而无法转换,则会引发异常,在这种情况下,我们会返回“FALSE” 好的,知道了。谢谢 StephaneM StephaneM 非常感谢。它现在工作正常。我得到了我想要的输出。【参考方案2】:hiredate 列是否有不止一种格式的日期?这将需要更复杂的代码,类似于
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
【讨论】:
您好,谢谢先生。但这对我不起作用。显示错误:ORA-06575:包或函数 ISDATE 处于无效状态 06575。00000 -“包或函数 %s 处于无效状态” *原因:SQL 语句引用了无效的 PL/SQL 函数状态。 Oracle 尝试编译该函数,但检测到错误。 *操作:检查 SQL 语句和 PL/SQL 函数是否存在语法错误或被引用对象的权限分配不正确或缺失。行错误:20 列:13以上是关于检查hire_date 的格式是不是为(DD-MMM-YYYY)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章