我的练习是为了显示10月份在星期天雇用的员工姓名
select ename,hiredate from emp where
to_char(hiredate,'MON')='OCTOBER' AND to_char(hiredate,'DAY')='SUNDAY'
还有
显示上个季度雇用的所有员工。
在oracle中我们不能使用qq,那么如何为此编写查询?
答案 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
对于您的其他问题,作为状态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
答案 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)