我在使用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