簡體   English   中英

T-SQL-兩個日期之間的總差

[英]T-SQL - Total difference between two dates

我有兩個表, 訂單訂單歷史記錄 ,訂單表具有訂單號訂單日期 ,即訂單實際下達的日期。

下面的模式和演示數據對此進行了演示;

CREATE TABLE #Orders
(
OrderNumber INT,
OrderDate DATETIME
)

INSERT INTO #Orders (OrderNumber,OrderDate)
VALUES
(001,'2019-04-16 07:08:08.567'),
(002,'2019-03-22 07:08:08.567'),
(003,'2019-06-30 07:08:08.567'),
(004,'2019-01-05 07:08:08.567'),
(005,'2019-02-19 07:08:08.567')

訂單審核表還包含訂單編號事件日期 ,即事件狀態更改的日期。

在以下架構和演示數據中對此進行了演示。

CREATE TABLE #Order_Audit
(
OrderNumber INT,
EventDate DATETIME,
Status INT
)

INSERT INTO #Order_Audit (OrderNumber,EventDate,Status)
VALUES
(001,'2019-04-16 07:08:08.567',1),
(001,'2019-04-19 07:08:08.567',2),
(001,'2019-04-22 07:08:08.567',3),
(001,'2019-04-28 07:08:08.567',4),
(001,'2019-04-30 07:08:08.567',5),
(002,'2019-03-22 07:08:08.567',1),
(002,'2019-03-24 07:08:08.567',2),
(002,'2019-03-26 07:08:08.567',3),
(002,'2019-04-01 07:08:08.567',4),
(002,'2019-04-10 07:08:08.567',5),
(003,'2019-06-30 07:08:08.567',1),
(003,'2019-07-15 07:08:08.567',2),
(003,'2019-07-19 07:08:08.567',3),
(003,'2019-07-20 07:08:08.567',4),
(003,'2019-07-21 07:08:08.567',5),
(004,'2019-01-05 07:08:08.567',1),
(004,'2019-01-06 07:08:08.567',2),
(004,'2019-01-07 07:08:08.567',3),
(004,'2019-01-08 07:08:08.567',4),
(004,'2019-01-09 07:08:08.567',5),
(005,'2019-02-19 07:08:08.567',1),
(005,'2019-03-19 07:08:08.567',2),
(005,'2019-03-21 07:08:08.567',3),
(005,'2019-03-22 07:08:08.567',4),
(005,'2019-03-23 07:08:08.567',5)

以下是我目前的查詢,它將為我提供事件日期和下訂單的日期之間的區別。

該查詢已簡化,但是包含了關鍵列。 這是在SQL Server 2012 SP4上執行的

SELECT  
    O.OrderNumber,
    DATEDIFF(DAY,O.OrderDate,OA.EventDate) AS [Day-Diff]
FROM #Orders O

INNER JOIN #Order_Audit OA ON OA.OrderNumber = O.OrderNumber

上面的查詢輸出是這樣的

|---------------------|------------------|
|      OrderNumber    |     DayDiff      |
|---------------------|------------------|
|          001        |         0        |
|---------------------|------------------|
|          001        |         3        |
|---------------------|------------------|
|          001        |         6        |
|---------------------|------------------|
|          001        |         12       |
|---------------------|------------------|
|          001        |         14       |
|---------------------|------------------|
|          002        |         0        |
|---------------------|------------------|
|          002        |         2        |
|---------------------|------------------|
|          002        |         4        |
|---------------------|------------------|
|          002        |         10       |
|---------------------|------------------|
|          002        |         19       |
|---------------------|------------------|

我真正需要的是一個查詢,它將輸出更多這樣的內容

|---------------------|------------------|
|      OrderNumber    |     DayDiff      |
|---------------------|------------------|
|          001        |                  |
|---------------------|------------------|
|          001        |                  |
|---------------------|------------------|
|          001        |                  |
|---------------------|------------------|
|          001        |                  |
|---------------------|------------------|
|          001        |                  |
|---------------------|------------------|
|          Total      |        14        |
|---------------------|------------------|
|          002        |                  |
|---------------------|------------------|
|          002        |                  |
|---------------------|------------------|
|          002        |                  |
|---------------------|------------------|
|          002        |                  |
|---------------------|------------------|
|          002        |                  |
|---------------------|------------------|
|          Total      |        19        |
|---------------------|------------------|

但是我無法弄清楚如何獲取每個訂單的訂單日期和最近的事件日期之間的差異,並將其添加到該訂單事件組的下方(如上所示)-我什至不確定T是否有可能-SQL,應該在應用程序級別進行處理。

您可以在下面嘗試。 我已經將Total標簽創建為OrderNumber + Total以進行訂購。

SELECT  
   CAST(O.OrderNumber AS VARCHAR) +  ' Total' OrderNumber,
    MAX(DATEDIFF(DAY,O.OrderDate,OA.EventDate)) AS [Day-Diff]
FROM #Orders O

INNER JOIN #Order_Audit OA ON OA.OrderNumber = O.OrderNumber
GROUP BY CAST(O.OrderNumber AS VARCHAR) +  ' Total'

UNION ALL

SELECT  
   CAST(O.OrderNumber AS VARCHAR) OrderNumber,
   NULL AS [Day-Diff]
FROM #Orders O

INNER JOIN #Order_Audit OA ON OA.OrderNumber = O.OrderNumber

ORDER BY 1

對於總計您可以group by ordernumber得到最后eventdate然后找到相應的差異orderdate
然后使用UNION ALL:

select t.OrderNumber, t.DayDiff
from (
  select ordernumber nr, cast(ordernumber as varchar(10)) OrderNumber, null DayDiff, 0 col 
  from order_audit
  union all
  select a.ordernumber nr, 'Total', datediff(day, o.orderdate, a.eventdate) DayDiff, 1 col
  from orders o inner join (
    select 
    ordernumber, max(eventdate) eventdate
    from order_audit
    group by ordernumber
  ) a on a.ordernumber = o.ordernumber
) t
order by t.nr, t.col

參見演示
結果:

> OrderNumber | DayDiff
> :---------- | ------:
> 1           |    
> 1           |    
> 1           |    
> 1           |    
> 1           |    
> Total       |      14
> 2           |    
> 2           |    
> 2           |    
> 2           |    
> 2           |    
> Total       |      19
> 3           |    
> 3           |    
> 3           |    
> 3           |    
> 3           |    
> Total       |      21
> 4           |    
> 4           |    
> 4           |    
> 4           |    
> 4           |    
> Total       |       4
> 5           |    
> 5           |    
> 5           |    
> 5           |    
> 5           |    
> Total       |      32

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM