2016-10-05 28 views
0

提取一天的char我想提取字符的一天,在下面的代碼:如何在Oracle

SELECT DN_DETAILS.DN,DN_WORKING_HOURS.DAY, 
     DN_WORKING_HOURS.BEGIN_HOUR, 
     DN_WORKING_HOURS.END_HOUR 
FROM DN_DETAILS 
    JOIN DN_WORKING_HOURS ON DN_DETAILS.DN=DN_WORKING_HOURS.DN 
WHERE DN_WORKING_HOURS.DAY = (SELECT TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'Day') FROM DUAL); 

山坳DN_WORKING_HOURS.DAY有天在形式「星期日」,「星期一」等...

什麼不對的:

(SELECT TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'Day') FROM DUAL) 

不知道我做錯了什麼

+1

你在相同的語言工作? SELECT TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY','Day')FROM DUAL'是什麼讓你在會話中運行整個查詢? 「DAY」列的數據類型是什麼? –

+1

DN_WORKING_HOURS.DAY是一個varchar2? –

+0

天col在CHAR中, – MoshMosh

回答

3

默認格式元素的Day被填充到日期語言中最長的日期名稱的長度;英文週三爲9個字符。你可以看到填充:

select '<'|| to_char(sysdate + level, 'Day') ||'>' from dual connect by level <= 7; 

'<'||TO_CHAR(SYSDATE+LEVEL,'DAY')||'>' 
-------------------------------------- 
<Thursday > 
<Friday > 
<Saturday > 
<Sunday > 
<Monday > 
<Tuesday > 
<Wednesday> 

您可以添加FM format model modifier,以抑制填充:

select '<'|| to_char(sysdate + level, 'FMDay') ||'>' from dual connect by level <= 7; 

'<'||TO_CHAR(SYSDATE+LEVEL,'FMDAY')||' 
-------------------------------------- 
<Thursday> 
<Friday> 
<Saturday> 
<Sunday> 
<Monday> 
<Tuesday> 
<Wednesday> 

因此,假設你的表的Dayvarchar2和不填充過多,你的子查詢必須:

(SELECT TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'FMDay') FROM DUAL) 

...或@a_horse_with_no_name提到做同樣的事情沒有一個子查詢:

... 
WHERE DN_WORKING_HOURS.DAY = TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'FMDay'); 

請記住這一天的名字是NLS相關的,所以如果這可能曾經在一個非英語環境中運行,你可以使它更安全:

... 
WHERE DN_WORKING_HOURS.DAY = TO_CHAR(TO_DATE('03/10/2016','DD/MM/YYYY'), 'FMDay', 
    'NLS_DATE_LANGUAGE=ENGLISH'); 
+0

謝謝你的幫助! – MoshMosh