将ORACLE SQL中的数字(10)字段转换为日期

d8tt03nd  于 2023-06-22  发布在  Oracle
关注(0)|答案(2)|浏览(349)

我有一个表,其中日期字段存储为数字(20161231 = 12/31/2016)。我想将此字段转换为日期。我尝试了以下操作,但收到了错误消息。

,TO_CHAR(TO_DATE(TR.CHEMO_DATE, 'YYYYMMDD'), 'mm/dd/yyyy') AS CHEM_DATE

错误:ORA-01847:一个月中的某一天必须介于1和该月的最后一天之间
我试过几种方法都没有用。谢谢你的帮助

5n0oy7gb

5n0oy7gb1#

当你对一个数字使用TO_DATE时,它会隐式地将数字转换为varchar2,然后将其传递给TO_DATE。只要你的数字总是有8位数(零填充个位数的月和日),并且它所代表的日期实际上存在于日历上,它就可以工作,尽管依赖隐式类型转换有点草率。在这种情况下,为了清楚起见,最好明确说明TO_CHAR。但你的代码仍然有效。
因此,您的数据中必须有一个错误的数字日期。要找到它,请查询:

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

一旦您确定了问题值,您就可以找出数据问题并解决它。

olmpazwi

olmpazwi2#

如果您的列是NUMBER,则使用TO_DATE将其转换为日期:

TO_DATE(TR.CHEMO_DATE, 'YYYYMMDD')
  • 注意:不清楚为什么使用NUMBER(10),因为格式只有8位。*

在Oracle中,DATE是一种二进制数据类型,由7个字节组成,代表世纪,世纪年,月,日,小时,分钟和秒。它始终具有这7个组件,并且从不以任何特定格式存储。
如果你想显示一个特定格式的DATE,那么:
1.更改用于访问数据库的客户端应用程序的设置,以允许它以特定方式设置日期格式。
如果您使用的是SQL*Plus或SQL Developer,则可以用途:

ALTER SESSION SET NLS_DATE_FORMAT='mm/dd/yyyy';

然后使用上面的查询。
如果您正在使用其他客户端应用程序,请参阅该应用程序的文档。
1.使用TO_CHARDATE转换为字符串(但这样就不会是DATE):

TO_CHAR(TO_DATE(TR.CHEMO_DATE, 'YYYYMMDD'), 'mm/dd/yyyy') AS CHEM_DATE

(正如你在问题中所做的那样)

相关问题