我是在约会,并得到了这样的要求。如果招聘日期在该月的第一至第七天(如2014年7月3日),则招聘日期应为2014年7月1日。如果招募日期是在该月的第7天之后(例如2014年7月8日)。招聘日期应在2014年8月1日下一个月。因此,我准备了一个SQL,使用add和round,但是它并没有给我想要的结果。你能帮我修改一下查询吗?
SELECT AST.X_REC_DT,
CASE
WHEN (to_char(AST.X_REC_DT, 'DD') <= 7)
THEN ROUND(to_date(add_months(AST.X_REC_DT, -1)))
when (to_char(AST.X_REC_DT, 'DD') > 7)
then ROUND(to_date(add_months(AST.X_REC_DT, 1)))
END AS RTD
FROM EMPLOYEE AST WHERE AST.ROW_ID = '1-EWR'
谢谢。
发布于 2016-01-11 21:47:27
不需要任何复杂的case语句,只需使用以下代码:
select trunc(add_months(ast.x_rec_dt,1)-7,'mm') RTD
from employee ast
where ast.row_id = '1-EWR';
它首先在所讨论的日期上添加一个月,然后从新的日期减去7天,然后将整件事情截断到这个月的开始。
发布于 2016-01-11 21:43:29
使用CASE
语句查看日期是在当前月份的第7天还是在此日期之前。如果不是,再加一个月。这个逻辑将向您展示如何使用2016年的所有日期作为测试数据。
WITH dates AS
(SELECT TO_DATE ('01-JAN-2016') + ROWNUM - 1 dte
FROM DUAL
CONNECT BY ROWNUM <= 365)
SELECT dte,
-- This is the logic you want right here:
CASE WHEN dte <= TRUNC (dte, 'MM') + 7 - 1 THEN TRUNC (dte, 'MM') ELSE TRUNC (ADD_MONTHS (dte, 1), 'MM') END
modified_dte
FROM dates;
发布于 2016-01-11 21:48:39
这个方法很有效:
select recruit_date,
case
when EXTRACT(day FROM recruit_date) <= 7 then trunc(recruit_date, 'MM')
else ADD_MONTHS(trunc(recruit_date, 'MM'),1)
end converted_date
from test;
它只使用三个简单的函数:
https://stackoverflow.com/questions/34731400
复制相似问题