Oracle SQL获得第一天的第一天

时间:2016-08-19 05:38:18

标签: sql oracle

要求输入日期应该产生当月的第一天。 条件是:

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

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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