2013-12-04 3 views
0

Мне нужна помощь, но я очень близок к достижению того, что ищу, благодаря this post. Однако это не совсем то, что мне нужно.Проверка разницы только в днях с LAG в Oracle

Использование LAG для проверки различий в датах, мне нужна LAG, чтобы игнорировать различия во времени и учитывать только даты. Другими словами, он должен учитывать только календарные дни, а не 24-часовые дни. Есть ли способ достичь этого?

Вот что я получил до сих пор:

SELECT EMPLOYEE_ID, 
SUM(DIFFERENCE) AS DAYS, 
DATE_IN, 
DATE_OUT 
FROM (
    SELECT * 
     FROM (
      SELECT EMPLOYEE_ID, DATE_IN, DATE_OUT, ACTIVE, 
      NVL(DATE_IN - LAG(DATE_IN) OVER (PARTITION BY EMPLOYEE_ID, ACTIVE ORDER BY DATE_IN), 1) AS DIFFERENCE 
    FROM MY_TABLE 
    WHERE MY_TABLE.ACTIVE = 1 
    AND TO_CHAR(DATE_IN, 'YYYY-MM-DD') >= 'user-selected date' 
    AND TO_CHAR(DATE_OUT, 'YYYY-MM-DD') <= 'other user-selected date' 
    ) 
) 
GROUP BY EMPLOYEE_ID, DATE_IN, DATE_OUT 
ORDER BY DATE_IN 

выводе я получаю:

EMPLOYEE_ID | DIFFERENCE   | DATE_IN   |  DATE_OUT 
    000199   1      2013/11/25 08:41:00 2013/11/25 16:41:00 
    000199   0.970833333333333  2013/11/26 07:59:00 2013/11/26 15:59:00 
    000199   1      2013/11/27 07:59:00 2013/11/27 15:59:00 
    000199   1.00069444444444  2013/11/28 08:00:00 2013/11/28 16:00:00 
    000199   1      2013/11/29 08:00:00 2013/11/29 16:00:00 

Что я ищу:

Различия здесь все должно быть 1, время должно игнорировать. Я попытался TO_CHAR (DATE_IN .......) в LAG, чтобы избавиться от временной части, но, конечно же, это не сработало: p

Спасибо за вашу помощь.

+1

использования 'TRUNC (date_in)' –

+0

@a_horse_with_no_name Так просто, и именно то, что я искал ... Спасибо! – oceansmoon

ответ

0

Ради Googlers:

TRUNC(DATE_IN) - LAG(TRUNC(DATE_IN) 

является ключом к игнорированию времени и получить результат только в течение нескольких дней.

Благодаря a_horse_with_no_name за ответ и учил меня о СТВОЛЕ в процессе :)

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