iT邦幫忙

0

oracle sql時間轉換錯誤問題 求解

  • 分享至 

  • xImage

各位前輩好 環境是oracle 11G
範例題目是
在OE帳戶orders資料表中,請完成下述WHERE子句,以查詢在2006年7月10日以前下訂之訂單編號和客戶編號以及訂單日期。
SELECT order_id, customer_id,TO_CHAR(order_date,'DD/MM/YYYY')
FROM orders
WHERE order_date < TO_DATE('JUL 10 2006','____________'); <===空格要下什麼


SELECT order_id,customer_id,TO_CHAR(order_date,'DD/MM/YYYY')
FROM orders
WHERE order_date < TO_DATE('JUL 10 2006','MON DD YY'); <====答案是給這樣
但執行是
ORA-01843: 不是有效的月份
01843. 00000 - "not a valid month"
*Cause:
*Action:


我的 nls_language是設中文
WHERE order_date < TO_DATE('7月 10 06','MM DD YY'); 改成這樣執行也不行

請問該怎麼打才是正確的?
這個是在練習TO_DATE函數轉日期字串 ,配合格式 改成'月 日 年'不是嗎@@

圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 個回答

2
一級屠豬士
iT邦大師 1 級 ‧ 2022-02-24 12:25:05
最佳解答

文件

demo

select TO_DATE('JUL 10 2006','MON DD YY', 'NLS_DATE_LANGUAGE = American')
from dual;

select to_date('2022-02-24', 'YYYY-MM-DD')
  from dual;
看更多先前的回應...收起先前的回應...
UncleBen iT邦新手 5 級 ‧ 2022-02-24 12:26:59 檢舉

請問一定要先改成英文顯示嗎?

你先試試看第二道!

另外你是看哪本書?

UncleBen iT邦新手 5 級 ‧ 2022-02-24 12:32:46 檢舉

書名可以講嗎XD 怕有廣告嫌疑oracle sql 2021/10出的

UncleBen iT邦新手 5 級 ‧ 2022-02-24 12:36:58 檢舉

一級哥
你給的兩行都可以執行
第一個結果是10-07月 -06
第二個結果是24-2月 -22

但是要怎麼解答我的題目呢?

UncleBen iT邦新手 5 級 ‧ 2022-02-24 12:56:59 檢舉

我在沒改NLS_DATE_LANGUAGE下
SELECT order_id,customer_id,TO_CHAR(order_date,'DD/MM/YYYY')
FROM orders
WHERE order_date < TO_DATE('2006-07-10', 'YYYY-MM-DD');
就可以執行了~~~
這樣是答案給錯了嗎???

那本書可能是翻譯的, 依照美國的習慣.
Oracle 的NLS 設定有分很多層級.
建議你先參考我給你的連結,裡面有提到多種 format, 月份部分使用
MM, 不要使用 MON 或是 MONTH.

UncleBen iT邦新手 5 級 ‧ 2022-02-24 13:19:42 檢舉

因為書的前四章有提到日期的都是寫DD MM YY~~
就這第五章出現MON DD yyyy
然後我直接在答案最後一行加上'NLS_DATE_LANGUAGE = American'
也是可以正常執行。
因為我是新手 沒啥概念~~
不知道該不該把NLS語言就固定設成American算了


SELECT order_id, customer_id,TO_CHAR(order_date,'DD/MM/YYYY')
FROM orders
WHERE order_date < TO_DATE('JUL 10 2006','MON DD YYYY','NLS_DATE_LANGUAGE = American');

補充要使用我們的格式的方法

select TO_DATE('中華民國111-02-24','eeyyy-mm-dd'
               , 'NLS_CALENDAR= ''ROC Official''')
  from dual;
 
select to_char(sysdate, 'eeyyy-mm-dd', 'NLS_CALENDAR= ''ROC Official''')
  from dual;

Demo

呼叫函數時指定,還是session層級指定,都是可以的,看自己的需求;
或者是使用配合的 format code,都是可以靈活使用的.

尼克 iT邦大師 1 級 ‧ 2022-02-24 13:54:10 檢舉

Oracle 日期格式有時候很煩!

我要發表回答

立即登入回答