Oracle试图按月订购至少15年的公司员工
SELECT TO_CHAR(hire_date, 'Month') AS "Month", COUNT (*) AS "Number of Hires"
FROM EMPLOYEES
WHERE TO_CHAR(SYSDATE,'YYYY') - TO_CHAR(HIRE_DATE,'YYYY') >14
GROUP BY TO_CHAR(hire_date,'Month')
ORDER BY "Month";
显示此
Month Number of Hires
------------------------------------ ---------------
April 7
August 9
December 7
February 13
January 14
July 7
June 11
March 17
May 6
November 5
October 6
Month Number of Hires
------------------------------------ ---------------
September
O想要的订单为
January
February
March
答案 0 :(得分:3)
问题在于'Month'
是一个字符串-不好订购,好几个月了。
SELECT TO_CHAR(hire_date, 'Month') AS "Month", COUNT(*) AS "Number of Hires"
FROM EMPLOYEES
WHERE EXTRACT(YEAR FROM SYSDATE) - EXTRACT(YEAR FROM HIRE_DATE) > 14
GROUP BY TO_CHAR(hire_date, 'Month')
ORDER BY EXTRACT(month FROM MIN(hire_date));
请注意,您不应该在字符串上使用算术-这根本不是字符串操作,并且您要避免隐式转换(因为它可能导致意外的问题)。因此,请使用内置函数提取年份。
请注意,您的逻辑并没有真正使“员工至少在公司工作15年”。那将是:
WHERE hire_date < sysdate - interval '15' year
答案 1 :(得分:1)
查询可以重新措辞如下以获得所需的结果:
select a.* from (
SELECT TO_CHAR(hire_date, 'Month') AS month, COUNT (*) AS "Number of Hires"
FROM EMPLOYEES
WHERE TO_CHAR(SYSDATE,'YYYY') - TO_CHAR(HIRE_DATE,'YYYY') >14
GROUP BY TO_CHAR(hire_date,'Month')) a
ORDER BY to_date('01-'||month||'-2018','DD-Month-YYYY');