2013-01-25 89 views
7

使用Oracle SQL,你如何创建一个结果集为:使用Oracle SQL,如何输出星期几和星期几?

  • 号(周一,周二,周三,等等)日的一周内(1-7)
  • 一天的名称

例如:

 
DAY NAME 
1  Monday 
2  Tuesday 
3  Wednesday 
4  Thursday 
5  Friday 
6  Saturday 
7  Sunday 
+1

这原本是一个措辞很差的问题。然而,它已被编辑和澄清,现在是一个非常有用的问题。本页上的答案对我来说简化了(最初)困难的Oracle问题很有帮助。这些答案在其他地方不可用。这个问题值得重新评估,并可能重新开放。 –

+0

现在这是一个真正的问题。 –

回答

17

弗洛林的答案是我该怎么做,但你需要对NLS设置有点小心。一周的天是由NLS领土受到影响,所以如果我运行这个,如果我在美国是它的工作原理:

alter session set nls_territory = 'AMERICA'; 

select to_char(sysdate, 'D') as d, to_char(sysdate, 'Day') as day from dual; 

D DAY         
- ------------------------------------ 
6 Friday        

select level as dow, 
    to_char(trunc(sysdate ,'D') + level, 'Day') as day 
from dual 
connect by level <= 7; 

DOW DAY         
--- ------------------------------------ 
    1 Monday        
    2 Tuesday        
    3 Wednesday        
    4 Thursday        
    5 Friday        
    6 Saturday        
    7 Sunday        

但在英国运行的同一查询是一个休息日:

alter session set nls_territory = 'UNITED KINGDOM'; 

select to_char(sysdate, 'D') as d, to_char(sysdate, 'Day') as day from dual; 

D DAY         
- ------------------------------------ 
5 Friday        

select level as dow, 
    to_char(trunc(sysdate ,'D') + level, 'Day') as day 
from dual 
connect by level <= 7; 

DOW DAY         
--- ------------------------------------ 
    1 Tuesday        
    2 Wednesday        
    3 Thursday        
    4 Friday        
    5 Saturday        
    6 Sunday        
    7 Monday        

...我需要调整计算更正为:

select level as dow, 
    to_char(trunc(sysdate ,'D') + level - 1, 'Day') as day 
from dual 
connect by level <= 7; 

DOW DAY         
--- ------------------------------------ 
    1 Monday        
    2 Tuesday        
    3 Wednesday        
    4 Thursday        
    5 Friday        
    6 Saturday        
    7 Sunday        

你也可以分别指定使用的日期名称的语言,如果你想:

select level as dow, 
    to_char(trunc(sysdate ,'day') + level - 1, 'Day', 
     'NLS_DATE_LANGUAGE=FRENCH') as day 
from dual 
connect by level <= 7; 

DOW DAY        
--- -------------------------------- 
    1 Lundi        
    2 Mardi        
    3 Mercredi       
    4 Jeudi        
    5 Vendredi       
    6 Samedi       
    7 Dimanche       

to_char() with nls_date_languageday of the week的文档,以及更多的globalisation support guide

-1
Select 1, 'Monday' from dual union all select 2, 'Tuesday' from dual ... 
+0

感谢您的回复。有没有使用UNION的另一种方法。 –

3
select level as dow, 
    to_char(level+trunc(sysdate,'D'),'Day') as day 
from dual 
connect by level <= 7;