【问题标题】:Oracle SQL Query to fetch non-working hours in a given monthOracle SQL 查询以获取给定月份的非工作时间
【发布时间】:2016-02-19 22:31:15
【问题描述】:

需要您的帮助来构建一个 Oracle SQL 查询,以捕获给定月份的非工作时间以获取行程列表。

传递的值将是开始日期和结束日期

例如:

Feb has totally 696 hrs
     Start Date        End Date 
S2 - 02-Feb-16 14:00 - 06-Feb-16 20:00 - 102hrs
S1 - 01-Feb-16 04:00 - 02-Feb-16 10:00 - 30hrs

                    Total Worked hrs   - 132 hrs

The query result expected is 564 hrs

尝试的查询:

SELECT (a)
FROM   (
  SELECT COUNT( (SELECT DISTINCT 'O'
                 FROM   TRIP s,
                        TRUCK p
                 WHERE  s.TRUCKID = p.TRUCKID
                 AND    p.NOTES2='ABC'
                 AND    p.TRUCKID='553'
                 AND    ( to_date(d,'DD-Mon-YYYY HH24')
                          NOT BETWEEN to_date(s.STIME,'DD-Mon-YYYY HH24')
                          AND to_date(s.ETIME,'DD-Mon-YYYY HH24')
                        )
               ) ) a
  FROM  (
    SELECT (TRUNC(to_date(sysdate,'DD-MON-YYYY'),'MM') + level - 1) d
    FROM   dual
    CONNECT BY level <= TO_CHAR(LAST_DAY(to_date(sysdate,'DD-MON-YYYY')),'DD')
  )
)

【问题讨论】:

  • 我尝试了类似的方法,但无法转换为小时。 SELECT (a) FROM (SELECT COUNT((SELECT DISTINCT 'O' FROM TRIP s,TRUCK p WHERE s.TRUCKID=p.TRUCKID AND p.NOTES2='ABC' AND p.TRUCKID='553' AND (to_date(d ,'DD-Mon-YYYY HH24') NOT BETWEEN to_date(s.STIME,'DD-Mon-YYYY HH24') AND to_date(s.ETIME,'DD-Mon-YYYY HH24')))) a FROM (SELECT (TRUNC(to_date(sysdate,'DD-MON-YYYY'),'MM') + level - 1) d FROM dual CONNECT BY level
  • 发表你迄今为止的最大努力,并解释你到底在哪里卡住了。
  • 将您的代码(使用edit)放入您的问题中。
  • 我尝试了类似下面的方法,但挑战无法以小时为单位获取值,以下查询检索天数代码:SELECT (a) FROM (SELECT COUNT((SELECT DISTINCT 'O' FROM TRIP s,TRUCK p WHERE s.TRUCKID=p.TRUCKID AND p.NOTES2='ABC' AND p.TRUCKID='553' AND (to_date(d,'DD-Mon-YYYY HH24') 不在 to_date(s. STIME,'DD-Mon-YYYY HH24') AND to_date(s.ETIME,'DD-Mon-YYYY HH24')))) a FROM (SELECT (TRUNC(to_date(sysdate,'DD-MON-YYYY'), 'MM') + level - 1) d FROM dual CONNECT BY level

标签: sql oracle date


【解决方案1】:
WITH Trip_Dates ( Start_Date, End_Date ) AS (
  SELECT TO_DATE( '2016-02-02 14:00:00', 'YYYY-MM-DD HH24:MI:SS' ), TO_DATE( '2016-02-06 20:00:00', 'YYYY-MM-DD HH24:MI:SS' ) FROM DUAL UNION ALL
  SELECT TO_DATE( '2016-02-01 04:00:00', 'YYYY-MM-DD HH24:MI:SS' ), TO_DATE( '2016-02-02 10:00:00', 'YYYY-MM-DD HH24:MI:SS' ) FROM DUAL
)
SELECT ( ADD_MONTHS( TRUNC( SYSDATE, 'MM' ), 1 ) - TRUNC( SYSDATE, 'MM' )
         - SUM( End_Date - Start_Date ) ) * 24 AS Unworked_Hours
FROM   Trip_Dates;

输出

UNWORKED_HOURS
--------------
           564 

【讨论】:

  • 嗨... 上面的查询工作正常,但我有 2 个差距 1. 如果时间有任何重叠,那么这些也被认为是 2. 如果开始时间在 1 月,结束时间是在二月份,它也会考虑查询。理想情况下,只有没有。需要考虑一月份的天数请帮助
猜你喜欢
  • 1970-01-01
  • 2012-01-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多