繁体   English   中英

To_char和To_date

[英]To_char and To_date

我正在努力处理一个包含varchar2列作为MON-YY格式的日期的报告

我想做的就是将该列的值转换为日期,以便可以对其进行一些处理,例如使用>或<甚至在之间进行过滤并设置两个日期

我的栏名称:BAL.PERIOD_NAME下面是条件查询错误ORA-01843:无效的月份

AND TO_DATE(BAL.PERIOD_NAME,'MON-YY')  > TO_DATE('FEB-18','MON-YY')

提前致谢

确保在转换日期使用正确的格式掩码。

作品:

select  TO_DATE('feb-18','MON-YY') from dual

抛出“无效月份”错误:

select  TO_DATE('02-18','MON-YY') from dual

您可以使用递归CTE检查表中的无用月份名称。

WITH cte(month)
AS
(
SELECT 1 month
       FROM dual
UNION ALL
SELECT month + 1 month
       FROM cte
       WHERE month + 1 <= 12
)
SELECT *
       FROM bal
       WHERE substr(period_name, 1, 3) NOT IN (SELECT to_char(to_date(month, 'MM'), 'MON')
                                                      FROM cte);

将日期值存储为'FEB-18''FEB-18'字符串确实是设计缺陷。 您应该考虑迁移到DATE (或TIMESTAMP )数据类型。

  • 您是否从未听说过2000年问题 好吧,我想当IT世界中的每个人都在谈论Y2K问题时,许多当前的软件开发人员还是小孩。
  • 该字符串可以任何形式变形。
  • 即使字符串格式正确,您也可能会遇到语言设置问题。

无论如何,也许这仅仅是一个语言问题。 试试这个

WHERE TO_DATE(BAL.PERIOD_NAME,'MON-RR', 'NLS_DATE_LANGUAGE = American') > DATE '2018-02-01'

如果您运行的是Oracle 12.2或更高版本,则可以使用VALIDATE_CONVERSION函数:

WHERE VALIDATE_CONVERSION(BAL.PERIOD_NAME, 'MON-RR', 'NLS_DATE_LANGUAGE = American') = 1

如果您还没有Oracle 12.2,请编写自己的函数,例如:

CREATE OR REPLACE FUNCTION CONVERT_TO_DATE(str in VARCAHR2) RETURN DATE IS
BEGIN
   RETURN TO_DATE(str, 'MON-RR', 'NLS_DATE_LANGUAGE = American');
EXCEPTION
   WHEN OTHERS THEN
      RETURN NULL;  
END CONVERT_TO_DATE;

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM