【问题标题】:T-SQL - Total difference between two datesT-SQL - 两个日期之间的总差异
【发布时间】:2023-03-23 10:49:01
【问题描述】:

我有两个表,OrdersOrder History,Orders 表有 Order NumberOrder Date strong> 这是实际下订单的日期。

这在下面的架构和演示数据中得到了证明;

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        |
|---------------------|------------------|

但是我不知道如何获取每个订单的 Order Date 和最近的 Event Date 之间的差异,并将其添加到该订单组的下方事件(如上所示) - 我什至不确定在 T-SQL 中是否可行,应该在应用程序级别处理。

【问题讨论】:

  • 如何计算 001 和 002 的总数为 14 和 19?这是每个 OrderNumber 的最后一个值吗?
  • @mkRabbani 是的,14 和 19 将是 Order_Audit 表中最近的 Event Date 与 Orders 表中针对每个 订单号
  • 添加了一个分析器。希望这会帮助你。 @BonzaOwl。

标签: sql sql-server tsql sql-server-2012 datediff


【解决方案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

请参阅demo
结果:

> 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

【讨论】:

    【解决方案2】:

    你可以在下面试试这个。我已将 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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-06-21
      • 1970-01-01
      • 2021-10-21
      • 2011-10-29
      • 2014-10-12
      • 1970-01-01
      • 2020-03-13
      • 2014-01-18
      相关资源
      最近更新 更多