Sql Datediff需要用于多行订单活动

Sql Datediff需要用于多行订单活动,sql,tsql,datediff,Sql,Tsql,Datediff,在SQL Server(TSQL)中,我需要查找所选订单活动之间的日期差异: tblOrderActivity OrderID ActivityID ActivityDate 1 1 4/16/2007 8:34:00 AM 1 2 4/16/2007 9:22:00 AM 2 1 4/16/2007 8:34:00 AM 3 1 4/16/2007 8:3

在SQL Server(TSQL)中,我需要查找所选订单活动之间的日期差异:

tblOrderActivity
OrderID  ActivityID  ActivityDate
1        1           4/16/2007 8:34:00 AM
1        2           4/16/2007 9:22:00 AM
2        1           4/16/2007 8:34:00 AM
3        1           4/16/2007 8:34:00 AM
3        2           4/16/2007 9:22:00 AM
4        1           4/16/2007 8:34:00 AM
4        2           4/16/2007 9:22:00 AM
无论如何。。。我知道DATEDIFF。因此,我目前的尝试如下所示:

Select DATEDIFF( MI,
    (select tblOrderActivity.ActivityDate 
        from tblOrderActivity
        where ActivityID = 1), 
    (select tblOrderActivity.ActivityDate
        from tblOrderActivity
        where ActivityID = 2) ) 
    SELECT
t1.OrderID,
DATEDIFF(MI, t1.ActivityDate, t2.ActivityDate) as TurnTime1,
DATEDIFF(MI, t2.ActivityDate, t3.ActivityDate) as TurnTime2,
DATEDIFF(MI, t3.ActivityDate, t4.ActivityDate) as TurnTime3,
DATEDIFF(MI, t1.ActivityDate, t4.ActivityDate) as TurnTime4 
FROM tblOrderActivity t1 INNER JOIN tblOrderActivity t2 ON t1.OrderID = t2.OrderID INNER JOIN tblOrderActivity t3 ON t2.OrderID = t3.OrderID INNER JOIN tblOrderActivity t4 ON t3.OrderID = t4.OrderID WHERE t1.ActivityID = 1 AND t2.ActivityID = 2 AND t3.ActivityID = 3 AND t4.ActivityID = 4 
如果我添加
和OrderID=1
或一个特定的数字,则此代码实际上可以工作。问题是。。。它需要适用于所有订单。因此,它应该将orderID作为一列返回,并从Activity=1的日期中减去ActivityID=2的日期。所以对于订单1,3和4,应该有48分钟。对于订单2,因为没有活动2,所以不应该有结果(我猜是空的?)

编辑:

好的,我遇到了另一个问题。这是“满”的桌子。每个订单有两个以上的活动

tblOrderActivity
OrderID  ActivityID  ActivityDate
1        1           4/16/2007 8:34:00 AM
1        2           4/16/2007 9:22:00 AM
1        3           4/16/2007 9:51:00 AM
1        4           4/16/2007 4:14:00 PM
2        1           4/16/2007 8:34:00 AM
3        1           4/16/2007 8:34:00 AM
3        2           4/16/2007 9:22:00 AM
这就是我当前的代码:

Select DATEDIFF( MI,
    (select tblOrderActivity.ActivityDate 
        from tblOrderActivity
        where ActivityID = 1), 
    (select tblOrderActivity.ActivityDate
        from tblOrderActivity
        where ActivityID = 2) ) 
    SELECT
t1.OrderID,
DATEDIFF(MI, t1.ActivityDate, t2.ActivityDate) as TurnTime1,
DATEDIFF(MI, t2.ActivityDate, t3.ActivityDate) as TurnTime2,
DATEDIFF(MI, t3.ActivityDate, t4.ActivityDate) as TurnTime3,
DATEDIFF(MI, t1.ActivityDate, t4.ActivityDate) as TurnTime4 
FROM tblOrderActivity t1 INNER JOIN tblOrderActivity t2 ON t1.OrderID = t2.OrderID INNER JOIN tblOrderActivity t3 ON t2.OrderID = t3.OrderID INNER JOIN tblOrderActivity t4 ON t3.OrderID = t4.OrderID WHERE t1.ActivityID = 1 AND t2.ActivityID = 2 AND t3.ActivityID = 3 AND t4.ActivityID = 4 
叹息。。。我似乎不擅长格式化代码块。我道歉

无论如何。当我运行这段代码时,它只给我顺序1,然后是周转时间1,2,3,4,等等。它没有给我其他2个顺序,因为(我假设)它们没有全部4个活动


有没有办法解释这一点?

假设您只想要ActivityID=1和ActivityID=2之间的差异,并且对于只有两个活动之一的订单没有行:

SELECT
    t1.OrderID,
    DATEDIFF(MI, t1.ActivityDate, t2.ActivityDate)
FROM tblOrderActivity t1
INNER JOIN tblOrderActivity t2 ON t1.OrderID = t2.OrderID
WHERE t1.ActivityID = 1 AND t2.ActivityID = 2

这里有两个问题:

首先,使用内部联接。内部联接指定如果在两个表中都找不到结果值,则不返回任何内容。如果您将所有内部联接更改为左外部联接,则将修复一半的问题,但不是全部

其次,在Where子句中指定每个ActivityID值。这意味着它正在查看每个ActivityID条目,并且仅当它等于1、2、3、4时才包含它,这是永远不会发生的。相反,您应该在联接本身中指定这些条件,如下所示:

Select ...
From tblOrderActivity t1
    Left Outer Join tblOrderActivity t2
        on t1.OrderID = t2.OrderID
            and t2.OrderID = 2
    Left Outer Join tblOrderActivity t3
        on t1.OrderID = t3.OrderID
            and t3.OrderID = 3
    Left Outer Join tblOrderActivity t4
        on t1.OrderID = t4.OrderID
            and t4.OrderID = 4

Where t1.OrderID = 1
您希望在where子句中指定t1.OrderID等于1,因为在您的帖子中,应该始终为真。记住,Where子句的总体评估必须始终为真。因此,您可以更改为左外部联接,但不更改Where条件,但仍然不起作用。您可以更改where条件,但不能更改联接,这将不起作用。你必须改变两者


希望这有帮助

我实际上需要为不同的活动做同样的事情,但这就像复制、粘贴和更改一些数字一样简单。无论如何,这是可行的。非常感谢。