我在select子句
中提交了一个查询,该查询有4个版本的查询SELECT
STUFF( (SELECT DISTINCT '; ' +
LEFT(CONVERT(VARCHAR, CAST( ADT2.EffectiveDTS AS DATE),101), 5)
FROM ADT AS ADT2
WHERE
DATENAME(dw, ADT2.EffectiveDTS) = 'Saturday' AND
CAST(ADT2.EffectiveDTS AS DATE) BETWEEN DATEADD(D, -30, CAST(ADT.EffectiveDTS AS DATE)) AND
CAST(ADT.EffectiveDTS AS DATE) FOR XML PATH('')), 1, 1,'')) AS Saturdays,
此特定查询吐出此10/08
; 10/29
; 10/15
; {SATURDAYs列} 10/22
。
我的第一步是引入一个日历表以在JOIN连接中使用。
INNER JOIN Reference.Calendar CAL
ON CAL.CalendarDTS = CAST(ADT.EffectiveDTS AS DATE)
我不确定转换DateTime字段是否有效,但是对于18K行(即6天的数据),查询从35秒下降到1的日期的索引。
我对这种改进感到惊讶,但后来又把它运行到了2015年1月。这导致我必须在大约10分钟后杀死查询。我知道那些上面的选择语句引起了问题,我的执行计划很可怕。
所以现在我正在考虑更换这些查询的最佳方法。仅供参考,由于我公司使用的工具,我仅限于使用视图。否则我确信我可以用Proc。
做得更好答案 0 :(得分:0)
如果您需要过去30天的星期六,那么您可以使用类似......的查询。
Declare @Date DATE = GETDATE();
-- Get Saturdays in last 30 days
Select CONVERT(VARCHAR(5) , DATEADD(DAY, Nums , @Date ), 1) [Date]
FROM (
SELECT TOP 30 -1 * ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) Nums
FROM master..spt_values
) a
WHERE DATENAME(WEEKDAY , DATEADD(DAY, Nums , @Date )) = 'Saturday'
我已对其进行了参数设置,因此您可以使用它而不仅仅是今天的日期。