显示在10月月的周日雇用的员工姓名

时间:2015-11-17 15:01:26

标签: sql oracle date-formatting

我的练习是为了显示10月份在星期天雇用的员工姓名

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

还有

  

显示上个季度雇用的所有员工。

在oracle中我们不能使用qq,那么如何为此编写查询?

4 个答案:

答案 0 :(得分:5)

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'

Oracle确实有the Q date format model,固定为日历月 - 因此1月至3月是第1季度。你可能想要财务季度;或者可能想要前三个月;或其他什么。

答案 1 :(得分:3)

你得到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:必须将'DAY'改为'FMDAY'。请参阅Alex Poole的答案以获得解释。

答案 2 :(得分:1)

要知道雇佣人员是否在最后一个季度,您可以检查月份是否大于或等于10

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

对于您的其他问题,作为状态hereMON返回缩写的月份名称。这导致OCTOBER不会是MON的输出。您要么MONTH要么to_char,要么将其与OCT进行比较。作为替代方案,你可能会这样做。如果是这样,请记住@ ThrostenKettner的评论。

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

答案 3 :(得分:0)

这是解决此问题的一种逻辑

请检查您是否要使用完整的感谢

SELECT ee。*,to_char(ee.hiredate,'Q')四分之一 来自员工ee 在哪里TO_CHAR(ee.HIREDATE,'DAY')IN(选择TO_CHAR(NEXT_DAY(dd.HIREDATE,'MON'),'DAY') 来自员工dd)