0

在 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) ) 

如果我添加AND OrderID = 1或添加特定数字,此代码实际上可以工作。问题是......它需要适用于所有订单。所以它应该将 orderID 作为一列返回,并且从 Activity = 1 的日期中减去 ActivityID = 2 的日期的结果。所以对于 Order 的 1、3 和 4,它应该有 48 分钟。对于订单 2,因为没有活动 2,所以那里不应该有结果(我猜是 NULL?)。

编辑:

好的,我遇到了另一个问题。所以这是“完整”表。每个订单有两个以上的活动。

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
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个活动。

有没有办法解决这个问题?

4

2 回答 2

0

你在这里有两个问题:

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

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

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 条件,但不能更改您的联接,它不会起作用。你必须改变两者!

希望这可以帮助!

于 2013-11-05T21:31:47.197 回答
0

假设您只想要 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
于 2013-11-04T23:28:29.137 回答