Как создать список всех дат между sysdate-30 и sysdate + 30? - PullRequest
5 голосов
/ 07 февраля 2012

Цель и что я получил до сих пор

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

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

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

Проблема

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

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

Вопрос

Есть ли способ сделать эквивалент "выбрать каждую дату между (sysdate + 30) и (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
; 

Ответы [ 3 ]

16 голосов
/ 07 февраля 2012
select trunc(sysdate)+31-level from dual connect by level <=61

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

0 голосов
/ 07 февраля 2012

Для того, чтобы соответствовать моим требованиям быть sysdate -30 и sysdate + 30 в диапазоне, это, кажется, самый элегантный способ сделать что-то на данный момент:

SELECT *
FROM   (SELECT TRUNC(SYSDATE - ROWNUM) DT
        FROM   DUAL
        CONNECT BY ROWNUM < 31
        UNION
        SELECT TRUNC(SYSDATE + ROWNUM) DT
        FROM   DUAL
        CONNECT BY ROWNUM < 31)DATERANGE; 

Я использовал этот ответ из этого SO Вопроса и расширил это мышление, используя объединение для объединения запросов, которые шли в разных направлениях.

0 голосов
/ 07 февраля 2012

Или другой метод: выбрать таблицу с большим количеством строк

select sysdate+30 - rownum from user_objects where rownum<61
...