在Oracle Query中选择Month

时间:2014-07-18 08:04:52

标签: oracle oracle11g toad

我在oracle中尝试了以下查询

select cast(TO_DATE (cal.MONTH,'MM') AS varchar2(30)) as result 
FROM  JOBCONTROL_USER.ods_calendar_weeks cal  
WHERE cal.YEAR NOT IN (0, 9999)

它以dd-mon-yy格式给出结果。现在我只想从结果中mon,如何在不使用to_char()的情况下实现此目标?

3 个答案:

答案 0 :(得分:1)

如果您要避免使用Oracle功能,并且月份编号作为varchar2字段自行存储,那么您可以强制它:

select case cast(month as number)
    when 1 then 'Jan'
    when 2 then 'Feb'
    when 3 then 'Mar'
    when 4 then 'Apr'
    when 5 then 'May'
    when 6 then 'Jun'
    when 7 then 'Jul'
    when 8 then 'Aug'
    when 9 then 'Sep'
    when 10 then 'Oct'
    when 11 then 'Nov'
    when 12 then 'Dec'
  end as mon
from ods_calendar_weeks cal
where cal.year not in (0, 9999);

但你必须指定语言;您无法将Oracle的月份转换为NLS日期语言。根据您的具体情况,这可能是奖金或问题。

我很想将这些转换放入查找表中并加入其中;或者将月份名称添加为表格中的单独列,作为11g中的虚拟列。

答案 1 :(得分:0)

select to_char(cal.Month,'month')
              ) AS result
FROM  JOBCONTROL_USER.ods_calendar_weeks cal  
WHERE cal.YEAR NOT IN (0, 9999);

这将给出月份。 to_char()是一个有两个参数的函数1.列名和2.月。列名是日期数据类型,因此我们必须将日期转换为字符数据类型,我们只需要月份,因此第二列将描述从日期中提取的内容。最后,结果显示为字符数据类型。如果年份既不是0也不是9999,则此查询将返回月份名称。

答案 2 :(得分:0)

您可以尝试这样的事情: -

SELECT EXTRACT(MONTH FROM CAST(TO_DATE (cal.MONTH,'MM') AS varchar2(30))) as RESULT 
FROM  JOBCONTROL_USER.ods_calendar_weeks cal  
WHERE cal.YEAR NOT IN (0, 9999)

希望这会对你有所帮助。