检查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_formatnls_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)? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

带日期的 SQL IF 语句

检查上传的文件是不是为 csv 格式

如何检查输入的电子邮件是不是为电子邮件格式[重复]

快速正则表达式检查字符串是不是为金额格式(2x,3x,...)

使用数字格式检查给定字符串是不是为有效货币

检查 mongodb 中的日期时间对象是不是为 UTC 格式或不是来自 python