组合不同的表并提取条件数据

时间:2013-10-03 07:41:59

标签: sql oracle

我正在经历某种问题。这是表模式。 我有两个表工作,申请。

Application: aid,aname,stime,jname
Job:jid,jname,aid,start,end

Application table:    
aid  aname   stime  
A    ABC     23-SEP-13  
B    DEF     24-SEP-13

Job table:  
jid  jname  aid      start                 end  
1    job1   A   10-OCT-13 13:06:20  11-OCT-13 13:06:45  
2    job2   A   10-OCT-13 14:06:20  11-OCT-13 14:09:55  
3    job1   B   10-OCT-13 15:16:20  11-OCT-13 15:06:45  
4    job2   B   10-OCT-13 15:26:20  11-OCT-13 15:46:45  

我需要输出如下。 我需要在每个应用程序中生成所有作业的开始和结束时间之间的差异。

aname   stime     jname   (end-start)Days  Hours  Minutes  Seconds
 ABC   23-SEP-13   job1        1            0       0       25
 ABC   23-SEP-13   job2        1            0       3       35
 DEF   24-SEP-13   job1        1            0       10      25
 DEF   24-SEP-13   job2        1            0       20      25    

我尝试使用in子句来解压缩但这里的问题是我无法从第二个表中检索多个列。 谢谢。

3 个答案:

答案 0 :(得分:2)

试试这个,

   SELECT a.aname, 
          A.stime, 
          j.jname, 
          floor(end - start) DAYS ,
          MOD(FLOOR ((end - start) * 24), 24) HOURS ,
          MOD (FLOOR ((end - start) * 24 * 60), 60) MINUTES ,
          MOD (FLOOR ((end - start) * 24 * 60 * 60), 60) SECS
   FROM   application a,
          JOB j
   WHERE  j.aid = a.aid;

使用您的样本数据。

WITH application(aid, aname, stime) AS
(
SELECT  'A', 'ABC', TO_DATE('23-SEP-13', 'DD-MON-YY') FROM DUAL
UNION ALL
SELECT 'B', 'DEF', TO_DATE('24-SEP-13', 'DD-MON-YY') FROM DUAL
),
JOB(JID, JNAME, AID, START_, END_) AS
(
SELECT 1, 'job1', 'A', TO_DATE('10-OCT-13 13:06:20', 'DD-MON-YY HH24:MI:SS'), TO_DATE('11-OCT-13 13:06:45', 'DD-MON-YY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 2, 'job2', 'A', TO_DATE('10-OCT-13 14:06:20', 'DD-MON-YY HH24:MI:SS'), TO_DATE('11-OCT-13 14:09:55', 'DD-MON-YY HH24:MI:SS') FROM DUAL
UNION ALL
SELECT 3, 'job1', 'B', TO_DATE('10-OCT-13 15:16:20', 'DD-MON-YY HH24:MI:SS'), TO_DATE('11-OCT-13 15:06:45', 'DD-MON-YY HH24:MI:SS')  FROM DUAL
UNION ALL
SELECT 4, 'job2', 'B', TO_DATE('10-OCT-13 15:26:20', 'DD-MON-YY HH24:MI:SS'), TO_DATE('11-OCT-13 15:46:45', 'DD-MON-YY HH24:MI:SS') FROM DUAL
)
SELECT a.aname, 
     A.stime, 
     j.jname, 
     floor(end_ - start_) DAYS ,
     MOD(FLOOR ((end_ - start_) * 24), 24) HOURS ,
     MOD (FLOOR ((end_ - start_) * 24 * 60), 60) MINUTES ,
     MOD (FLOOR ((end_ - start_) * 24 * 60 * 60), 60) SECS
FROM   application a,
     JOB j
WHERE  j.aid = a.aid
AND    a.stime > to_date('23-sep-12','dd-mon-yy');

答案 1 :(得分:0)

使用TIMESTAMPDIFF尝试使用{{3}}指定想要在月,日,分或秒中获得差异的格式

SELECT a.aname ,a.stime ,  j.jname,  
TIMESTAMPDIFF(DAY,j.`end`,j.`start`) AS 'end-start',
TIMESTAMPDIFF(HOUR,j.`end`,j.`start`) AS `hours`,
TIMESTAMPDIFF(MINUTE,j.`end`,j.`start`) AS `minutes`,
TIMESTAMPDIFF(SECOND,j.`end`,j.`start`) AS `seconds`
FROM `Application` a
LEFT JOIN `Job` j ON (j.aid =a.aid)
  

对于mysql的注意事项,请确保为日期列使用了正确的数据类型

答案 2 :(得分:0)

我认为我认为你的架构没有正确规范化。

我建议改为以下设计:

Application (aid, aname, stime, jid)
Job (jid, jname, start, end)

应用程序表将包含作业的应用程序。我们必须考虑一个应用程序是针对一个单独的作业进行的,任何作业在任何给定时间都可以有0个,1个或更多个应用程序。 因此,我在引用jid的{​​{1}}表中添加了外键Application

您可以像这样查询以获得所需的数据:

Job.jid

请注意,此查询仅适用于Oracle。