簡體   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