[英]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')
幾個問題/評論:
永遠不要在 varchar2 字段中存儲日期。 使用正確的 DATE 或 TIMESTAMP 數據類型來避免解析錯誤。 這只是自找麻煩。 最好使用正確的數據類型強制驗證。
此字段中的日期格式是 12 小時 AM/PM 還是 24 小時? 我沒有看到任何大於 11:xx 的值,所以無法判斷,但 HH 格式僅適用於 1-12 小時。 如果時間戳字符串是 24 小時格式,則需要使用 HH24。
切勿在比較中使用字符串文字,始終使用 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.