我在使用SQL查詢報告CNC監控系統的機器效率方面遇到了一些困難。監控軟件記錄機器處於不同狀態的持續時間,如加工,停止,失靈設置等。我希望每天爲每臺機器計算這些狀態的持續時間,以確定它們的效率。計算sql中兩個日期之間的持續時間
給出每個狀態的開始和結束時間我最初認爲這將是一個計算兩個日期之間差異的簡單情況,但並不那麼簡單。問題是一個國家可能會在一天後期開始,並在下一個凌晨結束,這使得很難計算每天的狀態持續時間。
下面是一個包含Excel文件的鏈接樣本數據 https://dl.dropboxusercontent.com/u/71259257/example%20dataset.xlsx
我想出了一個相當混亂的解決方案,我會以此爲基礎創建計劃存儲過程,輸出處理數據到一個單獨的表格。
這裏是我的查詢
DECLARE @date DATE;
SET @Date= '16 June 2015';
SELECT
Name, State,
CASE
WHEN LEFT(CONVERT(VARCHAR, StartDate, 120), 10) = @Date
AND LEFT(CONVERT(VARCHAR, EndDate, 120), 10) = @Date
THEN dbo.CalculateReportDuration(StartDate, EndDate)
END as Duration
FROM
[emc].[dbo].[TMB_MachineStateReport]
WHERE
CONVERT(Date, StartDate) = @Date
AND CONVERT(Date, EndDate) = @Date
UNION ALL
SELECT
Name, State,
dbo.CalculateReportDuration(LEFT(CONVERT(VARCHAR, EndDate, 120), 10) + ' 00:00:00.0000000 +00:00', EndDate) as Duration
FROM
[emc].[dbo].[TMB_MachineStateReport]
WHERE
CONVERT(Date, EndDate) = @Date
AND CONVERT(Date, StartDate) < @Date
UNION ALL
SELECT
Name, State,
dbo.CalculateReportDuration(StartDate, LEFT(CONVERT(VARCHAR, StartDate, 120), 10) + ' 23:59:59.9999999 +00:00')
FROM
[emc].[dbo].[TMB_MachineStateReport]
WHERE
CONVERT(Date, EndDate) > @Date
AND CONVERT(Date, StartDate) = @Date
我想知道的是,沒有任何人有任何更好的想法?理想情況下,我想創建視圖,但目前我依靠一個SQL變量來保存日期值,我將使用while循環遞增表中的所有日期。
代碼CalculateReportDuration功能
USE [emc]
GO
/****** Object: UserDefinedFunction [dbo].[CalculateReportDuration] Script Date: 06/20/2015 10:23:21 ******/
SET ANSI_NULLS ON
GO
SET QUOTED_IDENTIFIER ON
GO
ALTER FUNCTION [dbo].[CalculateReportDuration]
(
@start DATETIMEOFFSET(7),
@end DATETIMEOFFSET(7)
)
RETURNS INT
AS
BEGIN
RETURN CAST(ROUND(DATEDIFF(SECOND, @start, @end)/60.0, 0) AS INT)
END
任何幫助是極大你的兩個日期讚賞
請提供示例輸入和期望輸出,對於最壞的情況,最好還提供SQL小提琴鏈接。 –
好的會做的感謝 – user515031
可以用多個記錄來替代午夜過去的記錄,而不是。按程序進行處理或使用計數表。如果您確實/可能需要原始記錄(跨越多天),請使用額外的表格進行拆分(加上最初在一天內的限制)。 - 從那裏,你應該善於使用視圖。 - 如果您正在控制原始輸入流,則可能需要再次切換到基於日期的記錄(取決於此任務要求的外部情況),而不是平行於多天的記錄。 (對不起,沒有代碼準備好。) – Abecee