T-SQL - 两个日期之间的总差
T-SQL - Total difference between two dates
我有两个 table,订单 & 订单历史记录,订单table有订单号和订单日期,这是实际下订单的日期。
这在以下架构和演示数据中进行了演示;
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')
订单审核 table还包含订单号和事件日期 这是订单状态更改的日期。
这在下面的架构和演示数据中进行了演示。
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 中是否可行,应该在应用程序级别处理。
总计可以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
您可以在下面试试这个。我已将 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
我有两个 table,订单 & 订单历史记录,订单table有订单号和订单日期,这是实际下订单的日期。
这在以下架构和演示数据中进行了演示;
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')
订单审核 table还包含订单号和事件日期 这是订单状态更改的日期。
这在下面的架构和演示数据中进行了演示。
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 中是否可行,应该在应用程序级别处理。
总计可以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
您可以在下面试试这个。我已将 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