0

我之前问过关于将字符串转换为日期并对其进行格式化.. 根据 ORACLE 11g SQL 中的字符位置拆分字符串

这是我提出的解决方案,其中 WKENDING 是 VARCHAR2,RYEAR 是日期 WKENDING 的数据看起来像“523”(mmdd),而 RYEAR 是“2012”。

UPDATE OB_SEL_LST84_AGG_WKEND  SET WKENDYEAR =  (TO_DATE((TO_DATE(substr(WKENDING,3,2)),'dd')||(TO_DATE(substr(WKENDING,0,1)),'mon')||(TO_DATE(TO_CHAR(RYEAR)),'yyyy')),'dd-mon-yyyy');

我现在收到错误“ORA-00907:缺少右括号”,我已经仔细检查了几次括号,它们看起来对我来说是正确的..任何帮助都会很棒..谢谢!

更新 - 在查看了我上面的语法之后,我认为可能有太多的 TO_DATE 尝试转换正在进行。所以,我把它缩短到这个..

UPDATE OB_SEL_LST84_AGG_WKEND  SET WKENDYEAR =  (TO_DATE((substr(WKENDING,3,2))||(substr(WKENDING,0,1))||TO_CHAR(RYEAR)),'dd-mon-yyyy');

不过,我仍然收到缺少括号的错误.. ARGH!

4

1 回答 1

1

由于wkendyear列的数据类型是DATE,你应该只需要

UPDATE OB_SEL_LST84_AGG_WKEND  
   SET wkendyear = to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' )

当然,这假设您的所有字符串数据都可以转换为有效日期。只要您有 a wkendingof0229和 a ryearof 2013(或其他一些不是有效日期的字符串组合),该TO_DATE函数就会抛出异常。这就是在列中存储日期VARCHAR2通常存在问题的原因之一。

如果不是所有数据都可以正确转换为 a DATE,您可以创建一个尝试进行转换并NULL在出现异常时返回 a 的函数。例如

CREATE OR REPLACE FUNCTION my_to_date( p_str IN VARCHAR2, p_format IN VARCHAR2 )
  RETURN DATE
IS
  l_dt DATE;
BEGIN
  l_dt := to_date( p_str, p_format );
  RETURN l_dt;
EXCEPTION
  WHEN others THEN
    RETURN NULL;
END;

你的UPDATE陈述就会变成

UPDATE OB_SEL_LST84_AGG_WKEND  
   SET wkendyear = my_to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' )

您还可以查找无法将字符串转换为日期的行

SELECT *
  FROM OB_SEL_LST84_AGG_WKEND  
 WHERE my_to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' ) IS NULL
   AND (wkending IS NOT NULL or ryear IS NOT NULL)
于 2012-06-27T17:56:26.567 回答