Sql server 计算同一列中日期之间的差异

Sql server 计算同一列中日期之间的差异,sql-server,tsql,datediff,Sql Server,Tsql,Datediff,我正在尝试计算同一列中日期之间的差异,但迄今为止未成功。 这是我正在使用的数据,这是我到目前为止所做的代码。我提供的脚本供您参考。希望能有帮助 CREATE TABLE Test (Product varchar (250), Orderdate Datetime ); insert into TEST (product, orderdate) values ('A', '2019/01/01'), ('B', '2019/01/11'), ('C', '2019/01/15'), ('D

我正在尝试计算同一列中日期之间的差异,但迄今为止未成功。
这是我正在使用的数据,这是我到目前为止所做的代码。我提供的脚本供您参考。希望能有帮助

CREATE TABLE Test (Product varchar (250), Orderdate Datetime );
insert into TEST (product, orderdate) 
values ('A', '2019/01/01'), ('B', '2019/01/11'),  ('C', '2019/01/15'),  ('D', '2019/01/20');
我正在运行脚本并获得实际结果

SELECT  t.Product,  t.orderdate,    
        datediff(day,t2.orderdate,t.orderdate) as diffdays  
FROM TEST t  
  join test t2 on t2.product = t.product
以下是预期结果:

Product Orderdate   Diffdays
A       1/1/2019        0
B       1/11/2019       10
C       1/15/2019       4
D       1/20/2019       5
实际结果:

Product orderdate   diffdays
A       1/1/2019          0
B       1/11/2019         0
C       1/15/2019         0
D       1/20/2019         0

每个产品只有一行,所以如果你加入它,你将加入同一行与它本身,导致datediff为零,如你所见

相反,您可以根据
产品
延迟
订单日期
,并将其用于日期差异:

SELECT   product,
         orderdate,
         COALESCE(DATEDIFF(DAY, overdate, LAG(overdate) OVER (ORDER BY product)),0)
FROM     test
ORDER BY 1
尝试滞后功能:

SELECT 
product,
ISNULL(
   DATEDIFF(DAY, lag(orderdate,1) OVER (ORDER BY orderdate), orderdate),0) AS DIF
FROM TEST
ORDER BY PRODUCT

下面的查询将满足您的问题

SELECT X.Product,X.Orderdate,ISNULL(DATEDIFF(DAY,X.PREVDATE,X.Orderdate),0) AS DayDiff FROM (SELECT T.Product,T.Orderdate, LAG(T.Orderdate) OVER( ORDER BY ORDERDATE) AS PREVDATE  FROM Test T )X

这管用!非常感谢你!我将学习滞后函数,因为你们中的许多人都使用它来解决这个问题。如果你接受了答案,这将对其他用户有所帮助。
SELECT X.Product,X.Orderdate,ISNULL(DATEDIFF(DAY,X.PREVDATE,X.Orderdate),0) AS DayDiff FROM (SELECT T.Product,T.Orderdate, LAG(T.Orderdate) OVER( ORDER BY ORDERDATE) AS PREVDATE  FROM Test T )X