显示十月一个月的星期日雇用的雇员姓名

问题描述 投票:-1回答:4

我的练习显示要显示十月份的星期日雇用的员工姓名

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

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

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

sql oracle date-formatting
4个回答
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月为Q1。您可能需要财务季度;或可能需要前三个月;或其他东西。


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;

关于十月的星期日,您的查询看起来不错,但是您依赖数据库的英语设置。尽可能使用数字或指定使用的语言:

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的答案以获取解释。


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

0
投票

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

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

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

© www.soinside.com 2019 - 2024. All rights reserved.