簡體   English   中英

Oracle 將 varchar 轉換為 timeStamp 給出 ORA-01843: not a valid month

[英]Oracle convert varchar to timeStamp gives ORA-01843: not a valid month

SYSCREATEDATE 在 DB 中保存為 varchar2。 值如下:

SYSCREATEDATE
10/17/2006 7:44
11/29/2011 6:17
11/16/2011 11:46
2/27/2012 4:01
2/27/2012 4:01
2/27/2012 4:01

現在我想將該字段轉換為時間戳並選擇小於某個日期的日期,例如“06/01/2020”。

試過這個:

select * from legacy_case where  TO_TIMESTAMP(SYSCREATEDATE, 'MM/DD/YYYY HH:MI:SS') < '06/01/2020 00:00:00';

我收到以下錯誤:

ORA-01843: not a valid month
01843. 00000 -  "not a valid month"
*Cause:    
*Action:

請問有什么輸入嗎?

將字符串文字顯式轉換為timestamp

select * 
from legacy_case 
where  TO_TIMESTAMP(SYSCREATEDATE, 'MM/DD/YYYY HH:MI:SS') < TO_TIMESTAMP('06/01/2020 00:00:00', 'MM/DD/YYYY HH24:MI:SS')

幾個問題/評論:

  1. 永遠不要在 varchar2 字段中存儲日期。 使用正確的 DATE 或 TIMESTAMP 數據類型來避免解析錯誤。 這只是自找麻煩。 最好使用正確的數據類型強制驗證。

  2. 此字段中的日期格式是 12 小時 AM/PM 還是 24 小時? 我沒有看到任何大於 11:xx 的值,所以無法判斷,但 HH 格式僅適用於 1-12 小時。 如果時間戳字符串是 24 小時格式,則需要使用 HH24。

  3. 切勿在比較中使用字符串文字,始終使用 to_date 或 to_timestamp 進行轉換,因為文字可能與當前 NLS_DATE_FORMAT 默認值不匹配,並且可能無法正確解析。 您可以使用以下查詢查看默認格式:

select * 來自 nls_session_parameters 其中參數 = 'NLS_DATE_FORMAT';

我試圖重寫語句來測試你的時間格式。 它確實拋出了 ORA-01843。

SQL> select 'TRUE' "Compare" from dual where to_timestamp('10/17/2006 7:44', 'MM/DD/YYYY HH:MI:SS') < '06/01/2020 00:00:00';
select 'TRUE' "Compare" from dual where to_timestamp('10/17/2006 7:44', 'MM/DD/YYYY HH:MI:SS') < '06/01/2020 00:00:00'
                                                                                                 *
ERROR at line 1:
ORA-01843: not a valid month

錯誤消息中的指針 (*) 表示字符串 '06/01/2020 00:00:00' 是問題的根源。

為了使比較成功,您應該在同一基礎上比較雙方。 例如。

SQL> select 'TRUE' "Compare" from dual where to_timestamp('10/17/2006 7:44', 'MM/DD/YYYY HH24:MI:SS') < to_timestamp('06/01/2020 00:00:00','MM/DD/YYYY HH24:MI:SS');

Comp
----
TRUE

在上面的查詢中,我在兩邊都使用 TO_TIMESTAMP() function,另外,我使用 HH24 而不是你的 HH。 這一次,測試通過了。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM