显示在 10 月份的星期日录用的员工姓名

Display employee name who were hired on Sunday of October Month

我的练习是要显示在 10 月份的星期日被雇用的员工姓名

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

还有

Display all the employess who are hired in last quarter.

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

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

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

关于您的其他问题,如声明 hereMON return 月份的缩写名称。这导致 OCTOBER 不会是 MON 的输出。您要么在 to_char 中选择 MONTH,要么您希望将其与 OCT 进行比较。作为替代方案,您可能会这样做。如果是这样,请记住@ThrostenKettner 的评论。

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

您获得 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';

编辑:我刚刚再次阅读您的问题并开始思考:"last" quarter 是什么意思?在此之前的一个季度,正如我假设的那样,还是一年中的第 4 季度?那就是 where to_char(sysdate, 'q') = '4'.

编辑 2:必须将 'DAY' 更改为 'FMDAY'。请参阅 Alex Poole 的回答以获取解释。

MON 日期格式是缩写的月份名称,在当前seison 的NLS 日期语言中。您可以将缩写与简称或完整月份名称进行比较:

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

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

'FM' format modifier 停止添加尾随空格,这是默认情况下添加的,直到最长可能值的长度。如果你不这样做,你要么必须填充你的固定值,要么 trim 结果。 (请注意,对于某些语言,缩写也需要 FM 进行比较,因为即使它们的长度也会改变;在英语中不是这样,因为 MON 和 DY 值都是 3 个字符;但例如法语月份缩写可以是 3 或 4 个字符)。

不过,通常最好使用月份数字:

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

这将使您在任何一年都在 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 月是第一季度。你可能想要财务宿舍;或者可能需要前三个月;或其他。

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

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

SELECT ee.*,to_char(ee.hiredate,'Q') 季度 来自员工 其中 TO_CHAR(ee.HIREDATE,'DAY') 在 (SELECT TO_CHAR(NEXT_DAY(dd.HIREDATE,'MON') ,'DAY') 来自员工 dd)