我必须显示任何一年的五月或十一月雇用的所有雇员的雇用日期,最近雇用的雇员首先显示。此外,不包括1994年和1995年雇用的人员。雇用日期应指向该年5月或11月的最后一天(不是确切的一天),并且应采用以下格式: [1996年5月31日]
这是我到目前为止所得到的:
专栏:hire_date 表:员工
SELECT "[" || DATE_FORMAT(hire_date, %M %D %Y) || "]"
FROM employees
WHERE hire_date NOT IN ('%-%-94', '%-%-95')
AND hire_date in ('%-MAY-%', '%-NOV-%');
但它不起作用 请帮助找到正确的解决方案。
答案 0 :(得分:2)
以下适用于Oracle:
SELECT '[' || TO_CHAR(HIRE_DATE, 'MM DD YYYY') || ']' AS HIRE_DATE
FROM EMPLOYEES
WHERE TO_CHAR(HIRE_DATE, 'YYYY') NOT IN ('1994', '1995') AND
TO_CHAR(HIRE_DATE, 'MON') IN ('MAY', 'NOV')
分享并享受。
答案 1 :(得分:2)
将日期存储为DATE
或TIMESTAMP
数据类型是一个非常糟糕的主意。
更糟糕的是,年份仅由2位数构成。
如果HIRE_DATE是“正确的”数据类型,这是一个解决方案:
SELECT FIRST, LAST, HIRE_DATE,
TO_CHAR(LAST_DAY(HIRE_DATE),'"["Month ddTH" of "YYYY"]"') as D
FROM EMPLOYEES
WHERE EXTRACT(MONTH FROM HIRE_DATE) IN (5,11)
AND EXTRACT(YEAR FROM HIRE_DATE) NOT IN (1994, 1995)
ORDER BY HIRE_DATE DESC
如果HIRE_DATE是数据类型VARCHAR2
,请使用TO_DATE(HIRE_DATE, 'DD-MON-YY')
代替HIRE_DATE
答案 2 :(得分:0)
您是否希望将雇用日期显示为该月的最后一天。然后在选择
中使用以下内容TO_CHAR(LAST_DAY(HIRE_DATE), 'MM DD YYYY')
答案 3 :(得分:0)
hire_date
似乎存储为字符,因此您可以使用regexp_like
NOT regexp_like (HIRE_DATE,'\d{2}-[A-Z]{3}-(95|94)')
AND regexp_like (HIRE_DATE,'\d{2}-(MAY|NOV)-\d{2}')