2012-05-17 96 views
1

我试图运行下面的查询:问题执行SQL Server查询

SELECT 
    A.STEPNAME, 
    A.BRDATE BRDATE_A, 
    B.BRDATE BRDATE_B, 
    MIN(A.STARTTIME) STARTTIME_A, 
    MAX(A.ENDTIME) ENDTIME_A, 
    MIN(B.STARTTIME) STARTTIME_B, 
    MAX(B.ENDTIME) ENDTIME_B, 
    'RUNTIME_A' = convert(VARCHAR,DATEDIFF(MINUTE,A.STARTTIME,A.ENDTIME),108) , 
    'RUNTIME_B' = convert(VARCHAR,DATEDIFF(MINUTE,B.STARTTIME,B.ENDTIME),108) 
FROM 
    CB_OPX_AUDIT_HIST A, 
    CB_OPX_AUDIT_HIST B 
WHERE 
    A.BRDATE = ('05/11/2012') 
AND 
    B.BRDATE = ('05/16/2012') 
AND 
    A.BR = '03' 
AND 
    A.STEPNAME=B.STEPNAME 
AND 
    A.BR=B.BR 
GROUP BY 
    A.STEPNAME, 
    A.ENDTIME, 
    A.STARTTIME, 
    A.BRDATE, 
    B.BRDATE, 
    B.ENDTIME, 
    B.STARTTIME 
ORDER BY 
    A.STARTTIME 

我需要“RUNTIME_A”与“RUNTIME_B”之间的区别..

有人能告诉我,我如何获得上述查询中的区别。

+0

什么样的数据类型是'STARTTIME_A'和'ENDTIME'?我希望那些是'DATETIME'!那么你绝对不需要先把它们转换成'VARCHAR' - 只需在这些日期做'DATEADD'和'DATEDIFF',你就完成了... –

回答

0

为简单起见,我建议使用VARCHAR使用DATETIME只是改变和运行一个简单的DATEDIFF再次

DATEDIFF(MINUTE, 
    convert(DATETIME,DATEDIFF(MINUTE,A.STARTTIME,A.ENDTIME),108), 
    convert(DATETIME,DATEDIFF(MINUTE,B.STARTTIME,B.ENDTIME),108) 
) 

你可以用你原来的查询作为子查询来简化事情。

+0

如果'A.STARTTIME'和'A.之间的区别。 ENDTIME'是10分钟,你的COVERT会产生'1900-01-11',而不是'1900-01-01 00:10'。这是因为它会隐式地将'10'转换为DATETIME,并将其视为一个数值而不是几分钟。 * [如果唯一的愿望是以分钟为单位的差异,并且两个DATEDIFF产生分钟,为什么不只是从另一个减去一个DATEDIFF结果?] * – MatBailie

+0

是的,两者都会被转换为1900-01-01,所以它仍然会工作。这真的取决于OP真正需要什么 –

+0

我的意思是;不要把它们变成日期......你已经有了'a.start是来自a.end的X分钟'而'b.start是来自b.end的Y分钟'。那么为什么不只是做'X - Y'?将“X”转换为日期,将“Y”转换为日期,然后执行'DATEDIFF(分钟,X_as_a_date,Y_as_a_date)'的目的是什么? – MatBailie

0

将整个查询包含在另一个SELECT声明中。在外部选择语句中,您可以简单地选择RUNTIME_A - RUNTIME_B

0

你究竟是什么意思“得到不同”?

你已经在几分钟内得到了区别,它会一直不到一天吗?

这对你有用吗?

DATEADD(
    minute, 
    DATEDIFF(minute, A.STARTTIME, A.ENDTIME) 
    - 
    DATEDIFF(minute, B.STARTTIME, B.ENDTIME), 
    0 
) 

或者......

CONVERT(
    VARCHAR(8), 
    DATEADD(
    minute, 
    DATEDIFF(minute, A.STARTTIME, A.ENDTIME) 
    - 
    DATEDIFF(minute, B.STARTTIME, B.ENDTIME), 
    0 
), 
    108 
)