2016-01-11 3 views
1

Я работаю над датами и получил требование таким образом. В случае, если дата найма составляет от 1-го числа до 7-го числа месяца (например, 3 июля 2014 года), дата найма должна быть 1 июля 2014 года. В случае, если дата найма после 7-го числа месяца (например, 8 июля , 2014. Дата найма должна быть в следующем месяце 1 августа 2014 года. Итак, я подготовил SQL с использованием месяцев и раундов, но не дает желаемых результатов. Не могли бы вы помочь мне изменить запрос?Округление дат в оракуле

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' 

Спасибо.

ответ

4

Там нет необходимости в каких-либо сложных заявлений случае, просто используйте этот код:

select trunc(add_months(ast.x_rec_dt,1)-7,'mm') RTD 
    from employee ast 
where ast.row_id = '1-EWR'; 

Это первый добавляющий один месяц до указанной даты, затем вычитает 7 дней с новой даты, а затем обрезает все это к началу месяца.

+0

Ницца, логика превосходит SQL. :) Но что такое 'EWR'? –

+0

@GergelyBacso «1-EWR» пришел к вопросу OP. – Sentinel

+0

@Sentinel: Фантастический. Большое спасибо ! Не продумал этот угол :) –

1

Используйте 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; 
+0

Привет, Мэтью, я использовал TRUNC в моем запросе, и он решил цель. ВЫБОР AST.X_REC_DT, СЛУЧАЙ, КОГДА (ТО_СНАК (AST.X_REC_DT, 'DD') <= 7) ТОГДА ОТБР (TO_DATE (add_months (AST.X_REC_DT, 0)), 'Month'), когда (ТО_СНАК (АСТ .X_REC_DT, 'DD')> 7) , затем TRUNC (TO_DATE (add_months (AST.X_REC_DT, +1)), 'MONTH') END AS RTD ОТ EMPLOYEE AST WHERE AST.ROW_ID IN ('1-EWR' , '1-ATL') Спасибо за вашу удивительную помощь, как всегда! –

1

Это один работает:

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 (с добавлением месяцев)
  • экстракт (с указанием значений даты даты)
Смежные вопросы