рассчитать разницу между датами в одном столбце - PullRequest
1 голос
/ 07 мая 2019

Я пытаюсь вычислить разницу между датами в одном и том же столбце и пока безуспешно.
Вот данные, которые я использую, и вот код, который я сделал до сих пор.Я предоставил скрипт для вашей справки.Надеюсь, это поможет.

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

Ответы [ 4 ]

1 голос
/ 08 мая 2019

У вас есть только одна строка для каждого продукта, поэтому, если вы присоединитесь к нему, вы присоединитесь к той же самой строке с самим собой, в результате чего, как вы уже видели, будет указан нулевой дата.

Вместо этогоВы можете lag orderdate в соответствии с product и использовать это для датировки:

SELECT   product,
         orderdate,
         COALESCE(DATEDIFF(DAY, overdate, LAG(overdate) OVER (ORDER BY product)),0)
FROM     test
ORDER BY 1
0 голосов
/ 08 мая 2019

Запрос ниже удовлетворит вашу проблему.

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
0 голосов
/ 08 мая 2019
SELECT t.product, 
       t.orderdate, 
       IsNull(Datediff(day, Lag(t.orderdate, 1) 
                              OVER ( 
                                ORDER BY t.orderdate), t.orderdate), 0) 
FROM   test t 
0 голосов
/ 08 мая 2019

Попробуйте функцию задержки:

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