同一列SQL中两个日期的DateDiff
使用SQL Server 2005,我需要获取同一列中两个日期的同一列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
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是的。你的-非常整洁