【问题标题】:SQL query for retrieving the time gap between the timestamp values用于检索时间戳值之间的时间间隔的 SQL 查询
【发布时间】:2018-08-23 18:20:15
【问题描述】:

我在oracle中有两个表我需要为以下问题编写一个SQL查询,

注意:客户工作时间从早上9 a.m.6 p.m

tab1 包含问题创建和解决的时间戳,

在 tab1 中,24th dec 20176:00 p.m(办公室关闭时间)提出了一个问题,并在 26th dec 201710 a.m.(办公室开放后仅一小时)解决了问题

我想计算问题创建和解决之间的时间,在这种情况下,这两者之间的时间是"one hour",因为25-dec-2017 是假期

(假期表中有假期表)

条件1:如果日期之间存在假期日期,则应忽略

条件 2:如果这两个日期(创建和解决)之间存在周末(星期六和星期日),则应忽略它。

谁能帮我解决这个问题?

tab1 和 tab2:

【问题讨论】:

  • issue_created_date 和 issue_resolved_date 是否保证始终在工作日和工作时间内?如果是这样,那么问题比最一般的情况要容易一些。

标签: sql oracle timestamp date-difference


【解决方案1】:

您可以使用相关子查询来查找假期数(周末必须包含在假期表中)并使用 TIMESTAMP 操作来实现您的结果。这适用于 PostgreSQL,但应该很容易适应 Oracle:

SELECT issue_created_date, issue_resolved_date, ((days_in_bet - downtime_days) * INTERVAL '24 HOUR') + hours AS total_hours
FROM
(
SELECT issue_created_date, eod_timestamp, issue_resolved_date, sod_timestamp, downtime_days, 
       CASE WHEN DATE_TRUNC('DAY', issue_created_date) <> DATE_TRUNC('DAY', issue_resolved_date) THEN DATE(sod_timestamp) - DATE(eod_timestamp) - 1 ELSE 0 END AS days_in_bet,
       CASE WHEN DATE_TRUNC('DAY', issue_created_date) = DATE_TRUNC('DAY', issue_resolved_date) THEN issue_resolved_date - issue_created_date
        ELSE (eod_timestamp - issue_created_date) + (issue_resolved_date - sod_timestamp) END AS hours
FROM
(
    SELECT issue_created_date, DATE_TRUNC('DAY',issue_created_date) + INTERVAL '18 HOUR' AS eod_timestamp,
                                                                                    issue_resolved_date, DATE_TRUNC('DAY',issue_resolved_date) + INTERVAL '9 HOUR' AS sod_timestamp,
                                                                                    (SELECT COUNT(1) FROM tab2 h WHERE h.holiday BETWEEN i.issue_created_date AND i.issue_resolved_date) AS downtime_days
    FROM tab1 i 
) a1
) a2

请注意,此查询做出的一个重要假设是只能在工作日创建和解决问题。

输出:

issue_created_date    |  issue_resolved_date  | response_time_hours
"2017-12-24 18:00:00"   "2017-12-26 10:00:00"   "01:00:00"
"2017-12-26 13:00:00"   "2017-12-26 18:00:00"   "05:00:00"
"2017-12-27 08:00:00"   "2017-12-27 10:00:00"   "02:00:00"
"2017-12-27 14:00:00"   "2017-12-28 09:30:00"   "04:30:00"

【讨论】:

  • SELECT issue_created_date, DATE_TRUNC('DAY',issue_created_date) + INTERVAL '18 HOUR' AS eod_timestamp, issue_resolved_date, DATE_TRUNC('DAY',issue_resolved_date) + INTERVAL '9 HOUR' AS sod_timestamp, (SELECT COUNT (1) FROM tab2 h WHERE h.holiday BETWEEN i.issue_created_date AND i.issue_resolved_date) AS downtime_days FROM tab1 i -- 请分享此查询的示例输出
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-07-12
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-08-21
相关资源
最近更新 更多