同一列SQL中两个日期的DateDiff

同一列SQL中两个日期的DateDiff,sql,sql-server,sql-server-2005,Sql,Sql Server,Sql Server 2005,使用SQL Server 2005,我需要获取同一列中两个日期的datediff,表如下所示: OrderNo OpNo ResType LoadedStartDate ----------------------------------------------------- 12345 1 PAINT 2014-05-01 00:00:00.000 12345 2 PAINT 2014-05-02 00:00:0

使用SQL Server 2005,我需要获取同一列中两个日期的
datediff
,表如下所示:

OrderNo    OpNo    ResType    LoadedStartDate
-----------------------------------------------------
12345      1       PAINT      2014-05-01 00:00:00.000
12345      2       PAINT      2014-05-02 00:00:00.000
12345      3       PAINT      2014-05-03 00:00:00.000
12345      4       ASMB       2014-05-04 00:00:00.000
67890      1       PAINT      2014-05-02 00:00:00.000
67890      2       PAINT      2014-05-03 00:00:00.000
67890      3       PAINT      2014-05-04 00:00:00.000
67890      4       ASMB       2014-05-05 00:00:00.000
OrderNo    Difference
----------------------
12345      3
67890      3
SELECT DISTINCT OrderNo, DATEDIFF(day, 
          (SELECT LoadedStartDate FROM Orders WHERE OrderNo = Ord.OrderNo AND OpNo = 1),
          (SELECT LoadedStartDate FROM Orders WHERE OrderNo = Ord.OrderNo AND OpNo = 4)
       ) AS Diff
FROM Orders Ord
我需要得到OpNo 1和OpNo 4的日期差异,它们是相同的订单号。OpNo将始终是1和4,就像我试图比较的一样,ResType也是如此

输出需要如下所示:

OrderNo    OpNo    ResType    LoadedStartDate
-----------------------------------------------------
12345      1       PAINT      2014-05-01 00:00:00.000
12345      2       PAINT      2014-05-02 00:00:00.000
12345      3       PAINT      2014-05-03 00:00:00.000
12345      4       ASMB       2014-05-04 00:00:00.000
67890      1       PAINT      2014-05-02 00:00:00.000
67890      2       PAINT      2014-05-03 00:00:00.000
67890      3       PAINT      2014-05-04 00:00:00.000
67890      4       ASMB       2014-05-05 00:00:00.000
OrderNo    Difference
----------------------
12345      3
67890      3
SELECT DISTINCT OrderNo, DATEDIFF(day, 
          (SELECT LoadedStartDate FROM Orders WHERE OrderNo = Ord.OrderNo AND OpNo = 1),
          (SELECT LoadedStartDate FROM Orders WHERE OrderNo = Ord.OrderNo AND OpNo = 4)
       ) AS Diff
FROM Orders Ord

谢谢你的帮助:)

应该很简单

SELECT DATEDIFF(day, 
         (SELECT LoadedStartDate FROM Orders WHERE OrderNo = 12345 AND OpNo = 1),
         (SELECT LoadedStartDate FROM Orders WHERE OrderNo = 12345 AND OpNo = 4)
       )
因为内部选择返回标量值,所以它们可以用作DATEDIFF函数的参数

要使此操作适用于表中的所有订单,可以执行以下操作:

OrderNo    OpNo    ResType    LoadedStartDate
-----------------------------------------------------
12345      1       PAINT      2014-05-01 00:00:00.000
12345      2       PAINT      2014-05-02 00:00:00.000
12345      3       PAINT      2014-05-03 00:00:00.000
12345      4       ASMB       2014-05-04 00:00:00.000
67890      1       PAINT      2014-05-02 00:00:00.000
67890      2       PAINT      2014-05-03 00:00:00.000
67890      3       PAINT      2014-05-04 00:00:00.000
67890      4       ASMB       2014-05-05 00:00:00.000
OrderNo    Difference
----------------------
12345      3
67890      3
SELECT DISTINCT OrderNo, DATEDIFF(day, 
          (SELECT LoadedStartDate FROM Orders WHERE OrderNo = Ord.OrderNo AND OpNo = 1),
          (SELECT LoadedStartDate FROM Orders WHERE OrderNo = Ord.OrderNo AND OpNo = 4)
       ) AS Diff
FROM Orders Ord

演示:

只需将表本身连接起来:

SELECT t1.OrderNo,DATEDIFF(day,t1.LoadedStartDate,t2.LoadedStartDate)
FROM UnnamedTableFromQuestion t1
       INNER JOIN
     UnnamedTableFromQuestion t2
       on
         t1.OrderNo = t2.OrderNo
WHERE t1.OpNo = 1 and
      t2.OpNo = 4

CTE在这种情况下工作得很好。对于您的需求,您可以使用以下查询

with op1
As
(
select orderno, opno, restype, LoadedStartDate From orders
where opno = 1
),
op4
As
(
select orderno, opno, restype, LoadedStartDate From orders
where opno = 4
)
select op1.orderno, datediff(day, op1.loadedstartdate, op4.loadedstartdate) DifferenceDays 
from op1 inner join op4 on op1.orderno = op4.orderno
希望能有帮助

SELECT DISTINCT ORDERNO,MAX(DATEPART(DAY,LoadedStartDate))-MIN(DATEPART(DAY,LoadedStartDate))
FROM ORDERS GROUP BY ORDERNO
请注意,您可以使用:

SELECT DISTINCT ORDERNO,MAX(LoadedStartDate)-MIN(LoadedStartDate) FROM ORDERS GROUP BY ORDERNO
以datetime格式返回4天;可能是因为,由于没有时间,并且由于最小值和最大值的性质,数据库假设从第一天开始到第四天结束有整整四天


如果您确实有订单时间,并且希望在第一个订单和最后一个订单之间有一个精确的时间跨度,则可以将两个日期时间转换为一个整数,以毫秒为单位,从较高的数字中减去较低的数字,然后将答案重新转换为日期时间格式。

OOH,太好了。关联子查询,并使用
DISTINCT
伪造资源集。那个查询可能有一些性能问题。@Damien_The_unsiver是的。你的-非常整洁