我的练习显示要显示十月份的星期日雇用的员工姓名
select ename,hiredate from emp where
to_char(hiredate,'MON')='OCTOBER' AND to_char(hiredate,'DAY')='SUNDAY'
也
显示上季度雇用的所有雇员。
在oracle中,我们不能使用qq,所以如何为此编写查询?
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。您可能需要财务季度;或可能需要前三个月;或其他东西。
您使用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的答案以获取解释。
要知道雇用日期是否在最后一个季度,您可以检查月份是否大于或等于10
select ename,
hiredate
from emp
where to_char(hiredate,'MM')>=10
对于您的另一个问题,作为状态here,MON
返回月份的缩写。这将导致OCTOBER
不会成为MON
的输出。您可能不在MONTH
中的to_char
,或者想将其与OCT
进行比较。作为替代,您可能会这样做。如果是这样,请记住@ThrostenKettner的评论。
select ename,
hiredate
from emp
where to_char(hiredate,'MM')=10
and to_char(hiredate,'D')=1
这是解决此问题的一种逻辑
请检查您是否要使用完整的谢谢
SELECT ee。*,to_char(ee.hiredate,'Q')Quarter来自员工ee在哪里TO_CHAR(ee.HIREDATE,'DAY')IN(选择TO_CHAR(NEXT_DAY(dd.HIREDATE,'MON'),'DAY')来自员工dd)