2016-08-19 127 views
0

需求是输入日期应该产生月的第一天。 Condtions是:Oracle SQL获取月的第一天

  1. 如果输入的日期是30年11月16-NOV之间,然后在第一天将是16至11月
  2. 如果输入的日期在1-nov到15-nov之间,那么第一天将是01-nov。
  3. 其他月份应该返回相应月份的第01天。

回答

0

我用了一个冗长的CASE表达式来处理这个问题,它包含了你在问题中提到的三种情况的逻辑。

SELECT CASE WHEN EXTRACT(month FROM date) = 11 AND 
       EXTRACT(day FROM date) >= 16 
      THEN TO_DATE(EXTRACT(year FROM date) || '-11-16', 'yyyy-mm-dd') 
      ELSE TO_DATE(EXTRACT(year FROM date) || '-' || EXTRACT(month FROM date) || 
           '-01', 'yyyy-mm-dd') 
     END AS newDate 
FROM yourTable 
+0

其实你可以跳过第二个'WHEN'条件,因为“所有其他应返回本月1日”意味着“当1月之间,以11月15日则月1日” –

+0

@WernfriedDomscheit尼斯的观察,我已更新我的查询。 –

+0

@Tim感谢您的超级快速响应..按我的需要工作。 –

1

以Tim Biegeleisen的解决方案为基础,简化它并避免日期到文本到最新的转换。请注意使用TRUNC来获取期间的第一个日期。

SELECT 
    CASE 
     WHEN EXTRACT(MONTH FROM DATE_COL) = 11 AND EXTRACT(DAY FROM DATE_COL) >= 16 
      THEN TRUNC(DATE_COL, 'MONTH') + 15 
     ELSE TRUNC(DATE_COL, 'MONTH') 
    END AS FIRST_OF_MONTH 
FROM T1 
+0

谢谢。按我的需要工作。 –

相关问题