我正在努力处理一份报告,其中包含varchar2列作为MON-YY格式的日期
我想要做的是将该列的值转换为日期,以便我可以对其进行一些处理,例如使用>或<或什至在两个日期之间进行过滤
我的列名:BAL.PERIOD_NAME 以下是条件查询错误ORA-01843:无效的月份
AND TO_DATE(BAL.PERIOD_NAME,'MON-YY') > TO_DATE('FEB-18','MON-YY')
预先感谢
答案 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
)数据类型。
无论如何,也许这只是一个语言问题。试试这个
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