我在运行一段时间的查询时遇到问题。
场景是这样的:我在一个视图中填充了一个效率指标,接受来自另一个视图的输入。此计算使用GETUTCDATE(),我只是根据我的时区进行调整。我是通过使用"BuildTime“列值来计算效率,而不是从当天上午7:00起经过了多少时间(例如,如果从早上7:00到现在已经过去了120分钟,并且"BuildTime”等于120分钟,那么效率是100%。我还使用了一个CASE函数来仅计算操作时间之间的当前经过时间(7AM -3:30 am )
下面是代码:
SELECT
md.Operator,
CASE
WHEN DATEADD(HOUR, -6, GETUTCDATE()) > CONVERT(DATETIME, CONVERT(DATE, DATEADD(HOUR, -6, GETUTCDATE()))) + '7:00' AND GETDATE() < CONVERT(DATETIME, CONVERT(DATE, DATEADD(HOUR, -6, GETUTCDATE()))) + '15:30' THEN
(SUM(isNull(md.TotalTime, 0)) + SUM(isNull(md.DelTime, 0))) * 1.0 / DATEDIFF(MINUTE, CONVERT(DATETIME, CONVERT(DATE, DATEADD(HOUR, -6, GETUTCDATE()))) + '7:00' , DATEADD(HOUR, -6, GETUTCDATE())) * 100.0
ELSE (SUM(isNull(md.TotalTime, 0)) + SUM(isNull(md.DelTime, 0))) / 435 * 100.0
END
AS OpEfficiency
FROM [Booms MES Master Data] as md
WHERE md.[Date] = CONVERT(varchar(50), DATEADD(HOUR, -6, GETUTCDATE()), 101)
GROUP BY md.Operator到目前为止,这段代码需要几秒钟才能运行。我想知道问题出在代码的什么地方?是我转换了太多的语句,还是嵌套的if函数有问题?
发布于 2020-02-12 10:03:57
如果您有一个非常大的数据集,作为经验法则,首先从您的固定值开始,并将您的转换限制为最少的字符数。在这种情况下,varchar( 10 )是因为101格式日期只有10个字符( '12/12/1234‘)。
WHERE CONVERT(varchar(10), DATEADD(HOUR, -6, GETUTCDATE()), 101) = md.[Date]您可以使用Microsoft的Analyze an Actual Execution Plan来检测进一步的问题。
如果代码在sql server 2012+上运行,还应考虑转换为日期而不是varchar。在sql server中,日期存储为两个整数。如果您有多年的数据,那么sql在排序后查找特定数字要比搜索按mm/dd/yy排序的字符串容易得多。
WHERE CONVERT(date, DATEADD(HOUR, -6, GETUTCDATE())) = CONVERT(date,md.[Date])https://stackoverflow.com/questions/60175965
复制相似问题