尝试编写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;
任何人都可以帮忙解决此问题吗?
答案 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'