显示在 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
关于您的其他问题,如声明 here、MON
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)
我的练习是要显示在 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
关于您的其他问题,如声明 here、MON
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)