Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/80.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL-两个日期之间的总差值_Sql_Sql Server_Tsql_Sql Server 2012_Datediff - Fatal编程技术网

T-SQL-两个日期之间的总差值

T-SQL-两个日期之间的总差值,sql,sql-server,tsql,sql-server-2012,datediff,Sql,Sql Server,Tsql,Sql Server 2012,Datediff,我有两个表,订单和订单历史,订单表有订单编号和订单日期,这是实际下订单的日期 这在下面的模式和演示数据中进行了演示 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

我有两个表,订单订单历史,订单表有订单编号订单日期,这是实际下订单的日期

这在下面的模式和演示数据中进行了演示

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        |
|---------------------|------------------|
我实际上需要的是一个输出更像这样的查询

|---------------------|------------------|
|      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中是否可行,是否应该在应用程序级别进行处理。

对于总计,您可以
按订单号分组
,以获取最后一个
事件日期
,然后查找与相应的
订单日期
的差异
然后使用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
请参阅。
结果:


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

如何计算001和002的14和19的总和?这是每个订单号的最后一个值吗?@mkRabbani是的,14和19是订单审计表中最近的事件日期与订单表中每个订单号的订单日期之间的差值。希望这对你有帮助@BonzaOwl。