我有一张表,其中包含订单详情,例如,如果12345订单发布于08-01-2018 00:02并在08-01-2018 00:06完成,那么我希望结果集扩展为分钟到下面的东西。我们怎么能这样做SQL Server,基本上想要从开始分钟(00:02)到结束分钟(00:06)的每分钟结果中有一个单独的行,请建议,它应该是通用的,适用于所有其他原始数据
原始表:
OrderNo Order_received Order_Completes
-------------------------------------------
12345 08-01-2018 00:02:00 08-01-2018 00:06:00
期望的结果集
OrderNo. time Order_received order_complete
------------------------------------------------------------
12345 08-01-2018 00:02 1 0
12345 08-01-2018 00:03 1 0
12345 08-01-2018 00:04 1 0
12345 08-01-2018 00:05 1 0
12345 08-01-2018 00:06 0 1
答案 0 :(得分:1)
这是一个创建日期/时间列表的函数:
Create Function [dbo].[DateTimeTbl](@BeginDate DateTime, @EndDate DateTime)
RETURNS @retDate TABLE
(
Dt DateTime
)
BEGIN
While @BeginDate <= @EndDate
Begin
Insert Into @retDate (Dt) Values (@BeginDate);
Set @BeginDate = DateAdd("MINUTE", 1, @BeginDate);
End
RETURN;
END;
和用法:
SELECT * FROM DBO.[DateTimeTbl]('12/01/2015 12:01:00 AM', '12/01/2015 12:05:00 AM')
您可以在结果中加入此
答案 1 :(得分:0)
我会使用递归CTE,这也适用于具有null完整值的“open”订单:
DECLARE @myData TABLE (OrderNo INT, Order_Received DATETIME, Order_Completes DATETIME)
INSERT INTO @myData (OrderNo, Order_Received, Order_Completes)
VALUES (12345,'2018-01-08 00:02:00','2018-01-08 00:06:00')
--, (55555,'2018-01-08 00:05:00',NULL)
;WITH AllMinutes (OrderNo, Order_Received, Order_Completes, [time]) AS
(
SELECT OrderNo, Order_Received, Order_Completes,
Order_Received AS [time]
FROM @myData
UNION ALL
SELECT OrderNo, Order_Received, Order_Completes,
DATEADD(MINUTE,1,[time])
FROM AllMinutes
WHERE [time]<ISNULL(Order_Completes,CURRENT_TIMESTAMP)
)
SELECT OrderNo,
[time],
CASE WHEN [time] < ISNULL(Order_Completes,CURRENT_TIMESTAMP) THEN 1 ELSE 0 END,
CASE WHEN [time] = ISNULL(Order_Completes,CURRENT_TIMESTAMP) THEN 1 ELSE 0 END
FROM AllMinutes
WHERE [time] <= ISNULL(Order_Completes,CURRENT_TIMESTAMP)
ORDER BY OrderNo, [time]
OPTION(MAXRECURSION 0)
答案 2 :(得分:0)
只需使用递归CTE
方法
;with cte as
(
select OrderNo, order_completes, order_received from table
union all
select OrderNo,order_completes, dateadd(minute,1,order_received) order_received
from cte
where cte.order_received < order_completes
)
select c.OrderNo,
c.order_received [Time],
(case when c.order_received <> c.order_completes then 1 else 0 end) [Order_received],
(case when c.order_received = c.order_completes then 1 else 0 end) [Order_received]
from cte c
--option (MAXRECURSION 0)
答案 3 :(得分:-2)
declare @iMinn datetime;
set @iMinn = (select top 1 time from [your_table] where
OrderNo. = 12345 order by time);
while @iMinn < (select top 1 time from [your_table] where OrderNo. =
12345 and order_complete = 1 order by time desc)
begin
select
OrderNo.,
time,
Order_received,
order_complete
from [your_table];
set @iMinn = dateadd (minute,1,@iMinn);
end