SELECT *
FROM (SELECT TO_DATE(tr.chemo_date DEFAULT NULL ON CONVERSION ERROR,'YYYYMMDD') converted_date,
tr.*
FROM mytable tr)
WHERE converted_date IS NULL
AND chemo_date IS NOT NULL
你也可以创建一个捕获异常的函数来完成同样的事情:
CREATE OR REPLACE FUNCTION f_safe_int_to_date(in_char IN integer,in_format IN varchar2)
RETURN date
AS
BEGIN
var_date := TO_DATE(in_char,in_format);
RETURN var_date;
EXCEPTION
WHEN OTHERS THEN
RETURN NULL;
END;
/
SELECT tr.*
FROM mytable tr
WHERE f_safe_int_to_date(tr.chemo_date,'YYYYMMDD') IS NULL
AND tr.chemo_date IS NOT NULL
2条答案
按热度按时间5n0oy7gb1#
当你对一个数字使用
TO_DATE
时,它会隐式地将数字转换为varchar2
,然后将其传递给TO_DATE
。只要你的数字总是有8位数(零填充个位数的月和日),并且它所代表的日期实际上存在于日历上,它就可以工作,尽管依赖隐式类型转换有点草率。在这种情况下,为了清楚起见,最好明确说明TO_CHAR
。但你的代码仍然有效。因此,您的数据中必须有一个错误的数字日期。要找到它,请查询:
你也可以创建一个捕获异常的函数来完成同样的事情:
/
一旦您确定了问题值,您就可以找出数据问题并解决它。
olmpazwi2#
如果您的列是
NUMBER
,则使用TO_DATE
将其转换为日期:NUMBER(10)
,因为格式只有8位。*在Oracle中,
DATE
是一种二进制数据类型,由7个字节组成,代表世纪,世纪年,月,日,小时,分钟和秒。它始终具有这7个组件,并且从不以任何特定格式存储。如果你想显示一个特定格式的
DATE
,那么:1.更改用于访问数据库的客户端应用程序的设置,以允许它以特定方式设置日期格式。
如果您使用的是SQL*Plus或SQL Developer,则可以用途:
然后使用上面的查询。
如果您正在使用其他客户端应用程序,请参阅该应用程序的文档。
1.使用
TO_CHAR
将DATE
转换为字符串(但这样就不会是DATE
):(正如你在问题中所做的那样)