2015-11-17 52 views
-1

我練習說來顯示誰在十月顯示員工姓名

select ename,hiredate from emp where 
to_char(hiredate,'MON')='OCTOBER' AND to_char(hiredate,'DAY')='SUNDAY' 

而且

顯示所有的employess月份聘請了上週日的僱員姓名誰在上個季度僱用。

在oracle中我們不能使用qq所以如何寫這個查詢?

+0

在sql中,我們可以在datepart中使用qq。但是在oracle中沒有這樣的方法......對吧? –

+0

「*在oracle中,我們不能使用qq,因此如何爲此編寫查詢?*」qq是什麼意思?如果你的意思是** QUARTER **,那麼你當然可以做到。但是你的要求似乎與季度產量無關。另外,使用**日名稱**時,請注意** TO_CHAR **是** NLS依賴**。如果您不指定'NLS_DATE_LANGUAGE',那麼使用不同'NLS_DATE_LANGUAGE'的人將會失敗。 –

回答

0

知道,如果HIREDATE是在最後一個季度,你可以檢查月份是大於或等於10

select ename, 
     hiredate  
from emp 
where to_char(hiredate,'MM')>=10 

對於您的其他問題,如statet hereMON返回月份的縮寫名稱。這導致OCTOBER不會是MON的輸出。您要麼在to_char中輸入MONTH,要麼將其與OCT進行比較。作爲替代,你可以這樣做。如果有的話請記住@ ThrostenKettner的評論。

select ename, 
     hiredate 
from emp 
where to_char(hiredate,'MM')=10 
and to_char(hiredate,'D')=1 
+0

感謝和顯示十月份星期天聘用的員工姓名? –

+0

select ename,hiredate from emp where to_char(hiredate,'MON')='OCT'and to_char(hiredate,'DAY')='SUNDAY'Thanks :) –

+3

TO_CHAR(something,'D') 。您獲得的值取決於NLS_TERRITORY,因此您的查詢無法保證正常工作。 (我認爲這是一個缺陷,你不能在TO_CHAR中指定領土,以便在'D'上獲得可靠的響應。) –

2

用TO_CHAR('Q')得到季度。所以從SYSDATE拿到季度和計算前面:

select ename,hiredate  
from emp 
where to_char(hiredate, 'q') = 
    case to_char(sysdate, 'q') 
    when '1' then '4' 
    when '2' then '1' 
    when '3' then '2' 
    when '4' then '3' 
    end 
and extract(year from hiredate) = 
    case when to_char(sysdate, 'q') = '1' then 
    extract(year from sysdate) - 1 
    else 
    extract(year from sysdate) 
    end; 

至於星期天到10月,您的查詢看起來不錯,但你依靠數據庫英語設置。如果可能的話,或指定使用的語言更好地利用數字:

select ename, hiredate  
from emp 
where to_char(hiredate,'mm') = 10 
and to_char(hiredate, 'FMDAY', 'nls_date_language = american') = 'SUNDAY'; 

編輯:我剛剛看了一遍你的問題,來想:什麼是「最後的」季度是什麼意思?在此之前的這個季度,正如我所假設的那樣,還是一年中的第四季度?那將只是where to_char(sysdate, 'q') = '4'。編輯2:不得不將'天'改爲'FMDAY'。請參閱Alex Poole的解釋。

4

MON日期格式是當前sesison的NLS日期語言中的縮寫月份名稱。你可以可以使用簡短的名稱比較縮寫或完整月份名稱:

to_char(hiredate,'MON')='OCT' 

to_char(hiredate,'FMMONTH')='OCTOBER' 

'FM' format modifier停止其添加尾隨空格,它的默認操作,直至長儘可能長的價值。如果你不這樣做,你必須填充固定值,或者修改結果。 (請注意,對於某些語言,縮寫需要FM進行比較,即使它們的長度可以更改也是如此;不是英文,因爲MON和DY值都是3個字符;但法語月份縮寫可以是3或4個字符)。

它通常最好使用月數爲這個雖然:

to_char(hiredate,'MM')='10' 

,將讓你在十月任何一年;如果你想今年十月,你可以包括年份:

to_char(hiredate,'YYYYMM')='201510' 

或者,如果你想在本年度的前一個月,你可以使用:

trunc(hire_date, 'MM') = add_months(trunc(sysdate, 'MM'), -1) 

同樣的事情發生與天;在DAY格式墊到系統默認的最長的一天的名字,所以你需要:

to_char(hiredate,'DY')='SUN' 

to_char(hiredate,'FMDAY')='SUNDAY' 

你可以在這裏使用天數,但它們依賴語言環境了。如果你鑼使用的名字它的安全指定語言:

to_char(hire_date,'FMDAY','NLS_DATE_LANGUAGE=''ENGLISH''')='SUNDAY' 

甲骨文確實有the Q date format model,固定日曆月 - 所以一月至三月爲Q1。你可能需要財務季度;或者可能需要前三個月;或者是其他東西。

+0

好的答案。我偶然發現了過去的填充名字,並完全忘記了這一點。這是一個真正的麻煩。 –

相關問題