To_char和To_date

时间:2018-10-08 19:37:02

标签: sql oracle conditional-statements to-date to-char

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

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

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

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

预先感谢

3 个答案:

答案 0 :(得分:3)

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

作品:

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

抛出“无效月份”错误:

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

答案 1 :(得分:1)

您可以使用递归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);

答案 2 :(得分:1)

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

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

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

TIMESTAMP

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

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

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

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