Sql 尝试将两个截止日期(SUBSTR)合并为';dd mon yyyy';从字符串。。?

Sql 尝试将两个截止日期(SUBSTR)合并为';dd mon yyyy';从字符串。。?,sql,oracle11g,substr,concat,to-date,Sql,Oracle11g,Substr,Concat,To Date,我之前问过如何将字符串转换为日期并格式化。。 这里是我提出的解决方案,WKENDING是VARCHAR2,RYEAR是date 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_D

我之前问过如何将字符串转换为日期并格式化。。

这里是我提出的解决方案,WKENDING是VARCHAR2,RYEAR是date 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:缺少右括号”,我已经仔细检查了几次括号,它们看起来很对我。。任何帮助都会很好。。谢谢

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

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

但是我仍然得到缺少括号的错误。。啊

由于
wkendyear
列的数据类型是
DATE
,因此您只需

UPDATE OB_SEL_LST84_AGG_WKEND  
   SET wkendyear = to_date( lpad(WKENDING,4,'0') || RYEAR, 'mmddyyyy' )
当然,这假设所有字符串数据都可以转换为有效日期。一旦您有了
0229的
wkending
2013的
ryear
(或不是有效日期的字符串的其他组合),
TO_date
函数将抛出异常。这就是在
VARCHAR2
列中存储日期通常存在问题的原因之一

如果并非所有数据都能正确转换为
日期
,则可以创建一个函数,尝试进行转换,并在出现异常时返回
NULL
。比如说

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)

什么数据类型是wkendyear
?它是一个
VARCHAR2
?还是日期
?您似乎正在尝试将数据转换为
日期
,但
日期
没有格式,因此我有点困惑。@JustinCave-数据类型为DATE尝试了您的解决方案,但出现错误“ORA-01843:不是有效的月份”。。认为这是因为varchar2数据类型?@SeattleGray——最有可能的问题是,一些字符串数据行无法转换为有效日期。用代码更新了我的答案,该代码可以转换数据并识别出有问题的行。抱歉,伙计。。我编译了这个函数。。并运行您提供的update语句,然后运行select语句。。还是不走运。。我被难住了再看一次数据。。意识到你的功能确实起作用了。。唯一的问题是,我的数据不是我想象中的“0523”,而是“523”,而您的函数所处理的数据是像“1001”、“1101”或“1201”这样的数据。。对不起,我应该在……之前检查一下。。那么,我如何解释丢失的“0”?@SeattleGray-假设丢失的只是前导的“0”,我更新了答案,将
wkending
填充为4个字符。