sql - 如何生成 sysdate-30 和 sysdate+30 之间的所有日期列表?

标签 sql oracle gaps-and-islands

目的和我到目前为止所得到的

我正在尝试创建一个 View 来检查缺失的劳动力交易。该 View 将被输入到 Crystal 报表中。

在本例中, View 应采用 sysdate+30 和 sysdate -30 之间的所有日期,然后应将每个日期的在职员工的所有劳动记录进行左外连接。然后,它会给出每个日期每个员工的劳动力交易数量。

这将被传递到 Crystal Report,它将根据特定的日期范围(在 View 的 +/- 30 范围内)进行过滤。从那里开始,Crystal 中每个员工的所有天数将被汇总,并且员工将显示哪些交易为零。

问题

在不列出每个日期的列表的情况下,最初,我对每个日期使用劳动力交易,但有些日期没有任何日期的计数。这些人显示零小时的空交易日期。这表明他们在整个期间没有任何费用,这是有道理的。

但是,当 Crystal 对这些数据进行过滤并选择一个范围时,我相信它会忽略这些空值,因此不允许我显示没有时间提交的人员的全部范围。

问题

有没有办法在 View 中执行相当于“选择 (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
; 

最佳答案

select trunc(sysdate)+31-level from dual connect by level <=61

这是生成任意值列表的好方法。

关于sql - 如何生成 sysdate-30 和 sysdate+30 之间的所有日期列表?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9166877/

相关文章:

mysql - 获取 SQL 中唯一列的计数

mysql - 如何在SQL中制作二维计数表?

oracle - 比较 Oracle XQuery (XMLQuery/XMLTable) 中的日期

r - 在 R csv 中计算岛屿

sql - 优化函数,它提取时间戳中具有最小间隙的记录

python - 带有可变 WHERE 子句的批量更新表

具有一些用户定义字段的 SQL 数据库设计

sql - 如何从 Oracle 中的日期中减去小时数,因此它也会影响当天

sql - 甲骨文漏洞? SELECT 不返回重复项,SELECT 中的 INSERT 有重复的行

mysql - 游程长度或连续相同值编码的 SQL 查询