2015-08-25 3 views
0

У меня есть требование, в котором я должен найти дату начала и окончания. Дата начала: первая сидел в предыдущем месяце созданной даты, а дата окончания - в предыдущую пятницу от созданной даты. Например, ниже. Я прохожу созданную дату и мне нужно получить дату начала и окончания, как показано ниже.Предыдущие дни недели

CREATED_DT   Start_date  end_date 
04/08/2015 15:36  04/07/2015 00:00 31/07/2015 23:59 
07/07/2015 15:32  06/06/2015 00:00 03/07/2015 23:59 
+0

Пожалуйста, перейдите по адресу http://stackoverflow.com/tour и примите ответ в ответ, который решил вашу проблему. –

ответ

0

Использование функции Next_day. Функция Oracle/PLSQL NEXT_DAY возвращает первый день недели, который больше даты.

select TO_DATE('04/08/2015 15:36' ,'DD/MM/YYYY hh24:mi') as created_date, 
    next_day(ADD_MONTHS(TRUNC(TO_DATE('04/08/2015 15:36','DD/MM/YYYY hh24:mi')+1,'MM'),-1),'SATURDAY') 
    as start_date, 
    next_day(trunc(TO_DATE('04/08/2015 15:36','DD/MM/YYYY hh24:mi')-8)+0.99999 ,'FRIDAY')as end_date 
    FROM DUAL 

Вместо добавления 0.99999 мы можем достичь того же самого с 1-(1/(24*60*60)) мы добавляем один день после этого вычитает 1 части от 24*60*60 секунд.

+0

Спасибо, Тарун, но дата окончания, которая идет, также урезает отметку времени. это должно быть 23:59:59. – aadi

+0

Хорошо, я отредактирую свой код согласно вашему требованию. – Buddi

+0

@aadi я отредактировал код, пожалуйста, проверьте – Buddi

0

Вы можете использовать некоторые из функций Date. Я даю за sysdate. Используйте в соответствии с вашим требованием.

select NEXT_DAY(trunc((trunc (add_months (sysdate, -1), 'mm')), 'MONTH')-1, 'Saturday') as Start_date, 
     NEXT_DAY(SYSDATE-8, 'FRIDAY') as End_date 
from dual;  

Выход

START_DATE END_DATE 
04-JUL-15 21-AUG-15 
+0

Спасибо .. Но дата окончания, которую я ожидал, до 23:59:59 .. это не придет. Любая идея, как это сделать – aadi

+1

Обратите внимание на [Вопрос] (http://stackoverflow.com/questions/18916625/how-to-add-last-second-into-date/18916694#18916694). U просто нужно добавить '+ 0.99999' – Crazy2crack

+0

спасибо всем за ответы .. Отличная помощь !! – aadi

1

Вы не должны зависеть от локалей NLS настройки.

Вы можете использовать следующие функции:

  • NEXT_DAY
  • ADD_MONTHS
  • Trunc

Например,

SQL> alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS'; 

SQL> WITH t(created_dt) AS(
    2 SELECT to_date('04/08/2015 15:36','DD/MM/YYYY HH24:MI') FROM DUAL UNION ALL 
    3 SELECT to_date('07/07/2015 15:32','DD/MM/YYYY HH24:MI') FROM DUAL 
    4 ) 
    5 SELECT CREATED_DT, 
    6 NEXT_DAY(TRUNC(add_months(created_dt, -1),'MM') -1,TO_CHAR(to_date('6','J'),'Day')) -1 start_date, 
    7 NEXT_DAY(TRUNC(created_dt, 'MM')  -1, TO_CHAR(to_date('5','J'),'Day')) -1 + 0.99999 AS end_date 
    8 FROM t; 

CREATED_DT   START_DATE   END_DATE 
------------------- ------------------- ------------------- 
04/08/2015 15:36:00 04/07/2015 00:00:00 31/07/2015 23:59:59 
07/07/2015 15:32:00 06/06/2015 00:00:00 03/07/2015 23:59:59 

SQL> 

Чтобы получить временную часть как 23:59:59, вы можете либо добавить или вычесть 0.99999ИНТЕРВАЛ «1» ВТОРОЙ. Например,

SQL> alter session set nls_date_format='DD/MM/YYYY HH24:MI:SS'; 

Session altered. 

SQL> WITH t(created_dt) AS(
    2 SELECT to_date('04/08/2015 15:36','DD/MM/YYYY HH24:MI') FROM DUAL UNION ALL 
    3 SELECT to_date('07/07/2015 15:32','DD/MM/YYYY HH24:MI') FROM DUAL 
    4 ) 
    5 SELECT CREATED_DT, 
    6 NEXT_DAY(TRUNC(add_months(created_dt, -1),'MM') -1,TO_CHAR(to_date('6','J'),'Day')) -1 start_date, 
    7 NEXT_DAY(TRUNC(created_dt, 'MM')  -1, TO_CHAR(to_date('5','J'),'Day')) - (INTERVAL '1' SECOND) AS end_date 
    8 FROM t; 

CREATED_DT   START_DATE   END_DATE 
------------------- ------------------- ------------------- 
04/08/2015 15:36:00 04/07/2015 00:00:00 31/07/2015 23:59:59 
07/07/2015 15:32:00 06/06/2015 00:00:00 03/07/2015 23:59:59 

SQL> 
+0

Просто добавьте '0.99999' до конца, чтобы получить время как 23:59. –

+0

@JeffreyKemp Ах! Я пропустил, чтобы увидеть временную часть. Исправлено, спасибо. –

0

я достиг, таким образом

Даты окончания: Где созданного _dt этого значения даты, что я передаю .. !!

next_day(TRUNC(to_date(created_dt,'DD-MM-YYYY HH24:MI:SS'))-7,'FRIDAY') + 
INTERVAL '23:59:59' HOUR TO SECOND AS range_end_dt 
+2

Почему вы применяете to_date() к столбцу даты? –