执行SQL Server查询时出现问题

执行SQL Server查询时出现问题,sql,sql-server-2008,Sql,Sql Server 2008,我正在尝试运行以下查询: 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(MINU

我正在尝试运行以下查询:

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”之间的区别


有人能告诉我如何得到上述查询中的差异吗?

将整个查询包装在另一个
SELECT
语句中。在外部select语句中,您只需选择
RUNTIME\u A-RUNTIME\u B

您所说的“获取差异”到底是什么意思

你已经在几分钟内得到了差异,它总是少于一天吗

这对你有什么作用

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


为了简单起见,我建议从使用VARCHAR改为使用DATETIME,然后再次运行一个简单的datediff

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

您可以将原始查询包装为子查询以简化操作。

如果
a.STARTTIME
a.ENDTIME
之间的差异为10分钟,则您的COVERT将生成
1900-01-11
,而不是
1900-01-01 00:10
。这是因为它会隐式地将
10
转换为日期时间,并将其视为以天为单位的值,而不是以分钟为单位的值。[如果唯一的愿望是以分钟为单位计算差异,并且两个DATEDIFF都产生分钟,为什么不从另一个结果中减去一个DATEDIFF结果?]是的,两个结果都将转换为1900-01-01,因此仍然有效。这真的取决于OP真正需要什么意思;根本不要把它们变成约会。。。您已经有了
a。开始是距离a.end的X分钟
b。开始是距离b.end的Y分钟
。那么,为什么不干脆做
X-Y
?将
X
转换为日期,将
Y
转换为日期,然后执行
DATEDIFF(分钟,X作为a\u日期,Y作为a\u日期)
的目的是什么?什么数据类型是
STARTTIME\u a
ENDTIME
??我希望这些是
DATETIME
!那么你肯定不需要先把它们转换成
VARCHAR
——只需在这些日期执行
DATEADD
DATEDIFF
,就可以了。。。
DATEDIFF(MINUTE, 
    convert(DATETIME,DATEDIFF(MINUTE,A.STARTTIME,A.ENDTIME),108), 
    convert(DATETIME,DATEDIFF(MINUTE,B.STARTTIME,B.ENDTIME),108)
)