Как создать список всех дат между sysdate-30 и sysdate+30?

Цель и что у меня получилось

Я пытаюсь создать представление, которое проверяет отсутствующие трудовые операции. Представление будет передано в отчет Crystal.

В этом случае представление должно брать все даты между sysdate+30 и sysdate -30, а затем левым внешним соединением объединять все трудовые записи по активным сотрудникам для каждой из этих дат. Затем он выдает подсчет количества трудовых операций для каждого сотрудника за каждую дату.

Это передается в Crystal Report, который будет фильтровать на основе определенного диапазона дат (в пределах диапазона +/- 30 по представлению). Отсюда подсчет всех дней будет суммироваться по каждому сотруднику в Crystal, и будут показаны сотрудники, у которых нулевые операции.

Проблема

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

Однако, когда Crystal делает фильтр на этих данных и выбирает диапазон, я полагаю, что он оставляет эти нулевые значения, тем самым не позволяя мне показать полный диапазон людей, у которых нет начислений.

Вопрос

Есть ли способ сделать эквивалент "select every date between (sysdate+30) and (sysdate-30)" в представлении, чтобы я мог использовать его для сравнения всего времени?

SQL (для справки)

SELECT QUERY.LABORRECLABORCODE
       , QUERY.LABORRECEMPLOYEENUM
       , QUERY.PERSONRECDISPLAYNAME
       , QUERY.TRANSSTARTDATE
       , COUNT(TRANSROWSTAMP) AS ROWCOUNT
FROM   (SELECT *
        FROM  (SELECT LABOR.LABORCODE      AS LABORRECLABORCODE
                      , LABOR.LA20         AS LABORRECEMPLOYEENUM
                      , PERSON.DISPLAYNAME AS PERSONRECDISPLAYNAME
               FROM   LABOR
                      LEFT OUTER JOIN PERSON
                        ON ( LABOR.LABORCODE = PERSON.PERSONID )
               WHERE  LABOR.STATUS = 'ACTIVE'
                  AND LABOR.LA20 IS NOT NULL
                  AND PERSON.DISPLAYNAME IS NOT NULL
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%kimball%'
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%electrico%'
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%misc labor cost adj%'
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%brossoit%'
                  AND LOWER(PERSON.DISPLAYNAME) NOT LIKE '%brossiot%')PERSONINFO
              LEFT OUTER JOIN (SELECT STARTDATE   AS TRANSSTARTDATE
                                      , LABORCODE AS TRANSLABORCODE
                                      , ROWSTAMP  AS TRANSROWSTAMP
                               FROM   LABTRANS
                               WHERE  STARTDATE BETWEEN ( SYSDATE - 30 ) AND ( SYSDATE + 30 ))LABTRANSLIMITED
                ON ( PERSONINFO.LABORRECLABORCODE = LABTRANSLIMITED.TRANSLABORCODE ))QUERY
GROUP  BY LABORRECLABORCODE
          , TRANSSTARTDATE
          , LABORRECEMPLOYEENUM
          , PERSONRECDISPLAYNAME
ORDER  BY LABORRECLABORCODE
          , TRANSSTARTDATE
; 
6
задан pilcrow 10 September 2012 в 04:32
поделиться