首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在甲骨文中舍入日期

在甲骨文中舍入日期
EN

Stack Overflow用户
提问于 2016-01-11 21:26:45
回答 3查看 55关注 0票数 1

我是在约会,并得到了这样的要求。如果招聘日期在该月的第一至第七天(如2014年7月3日),则招聘日期应为2014年7月1日。如果招募日期是在该月的第7天之后(例如2014年7月8日)。招聘日期应在2014年8月1日下一个月。因此,我准备了一个SQL,使用add和round,但是它并没有给我想要的结果。你能帮我修改一下查询吗?

代码语言:javascript
运行
复制
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'

谢谢。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2016-01-11 21:47:27

不需要任何复杂的case语句,只需使用以下代码:

代码语言:javascript
运行
复制
select trunc(add_months(ast.x_rec_dt,1)-7,'mm') RTD
  from employee ast
 where ast.row_id = '1-EWR';

它首先在所讨论的日期上添加一个月,然后从新的日期减去7天,然后将整件事情截断到这个月的开始。

票数 4
EN

Stack Overflow用户

发布于 2016-01-11 21:43:29

使用CASE语句查看日期是在当前月份的第7天还是在此日期之前。如果不是,再加一个月。这个逻辑将向您展示如何使用2016年的所有日期作为测试数据。

代码语言:javascript
运行
复制
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;
票数 1
EN

Stack Overflow用户

发布于 2016-01-11 21:48:39

这个方法很有效:

代码语言:javascript
运行
复制
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;

它只使用三个简单的函数:

  • trunc (默认情况下截断日期,但如上面所示,可以根据需要将其参数化)
  • add_months (加月份)
  • 提取(提取特定日期值)
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34731400

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档