[英]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
)數據類型。
無論如何,也許這僅僅是一個語言問題。 試試這個
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.