格式化日期错误 - Oracle 11g

时间:2014-11-09 20:41:58

标签: oracle oracle11g

尝试编写SQL查询来格式化日期输出,但是我收到一条错误声明,'找到了一个非数字字符,其中包含数字。'

下面是我的SQL:

SELECT e.emp_num, emp_lname, emp_fname, sal_amount
FROM LGEMPLOYEE e
JOIN LGSALARY_HISTORY sh ON e.emp_num = sh.emp_num
WHERE sal_from = (SELECT MIN (to_date(sal_from,'dd-mon-yy'))
                FROM LGSALARY_HISTORY sh 
                WHERE sh.emp_num = e.emp_num)
ORDER BY e.emp_num;

任何人都可以帮忙解决此问题吗?

2 个答案:

答案 0 :(得分:1)

尝试替换

MIN (to_date(sal_from,'dd-mon-yy'))

TO_CHAR(MIN (to_date(sal_from,'dd-mon-yy')), 'dd-mon-yy')

您尝试将VARCHAR2与DATE进行比较。 Oracle使用以下规则进行隐式类型对话:

  

将字符值与DATE值进行比较时,Oracle会进行转换   字符数据到DATE。

只是一个假设:Oracle正在尝试使用默认NLS设置(会话或数据库)将sal_from转换为DATE,并且显然失败(因为默认日期格式为' dd-mm-yy'例如)

答案 1 :(得分:0)

这就是为什么在varchar2列中存储日期值绝不是一个好主意。表中至少有一行sal_from中的字符串不是您期望的格式。这导致to_date调用抛出错误。

隔离有问题的行的一种方法是

CREATE OR REPLACE FUNCTION is_valid( p_str IN VARCHAR2, p_mask IN VARCHAR2 )
  RETURN VARCHAR2
IS
  l_date     DATE;
BEGIN
  l_date := to_date( p_str, p_mask );
  RETURN 'Y';
EXCEPTION
  WHEN others THEN
    RETURN 'N';
END;

然后

SELECT *
  FROM lgsalary_history
 WHERE is_valid( sal_from, 'dd-mon-yy' ) = 'N'