2016-08-19 6 views
0

Требование - дата ввода должна выдавать первый день месяца. Condtions являются:Oracle SQL, чтобы получить первый день месяца

  1. Если дата ввода между 16-нови 30-нови, то первый день будет 16-ноябрю
  2. если введенная дата находится между 1 нов. По 15 нов., Тогда первый день будет 01-нов.
  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-нови до 15-нови затем 1 ноября» –

+0

@WernfriedDomscheit Nice наблюдение, я обновили мой запрос. –

+0

@Tim Спасибо за сверхбыстрый отклик .. работающий как мне нужно. –

1

Опираясь на решение Тима 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

Спасибо. работая, как мне было нужно. –

Смежные вопросы