有人递给我有SELECT子句如何展现MM/DD这是星期六为过去30天
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
在4个版本此查询了一个查询; 10/29
; 10/15
; 10/22
到SATURDAYs列。
我的第一步是在JOIN连接中引入一个日历表。
INNER JOIN Reference.Calendar CAL
ON CAL.CalendarDTS = CAST(ADT.EffectiveDTS AS DATE)
我不知道,如果铸造日期时间字段将是有效的,但与上查询从35秒下降到1 18K行是数据的六天时间的索引。
我对这种改进感到惊讶,但后来我将其运行回到2015年1月。这使我不得不在10分钟后杀死查询。我知道那些高级选择语句导致问题,我的执行计划是可怕的。
所以现在我正在想办法替代这些查询的最佳方法。仅供参考,由于我公司使用的工具,我仅限于使用视图。否则,我相信我可以用Proc做得更好。
EffectiveDTS的数据类型是什么?将它作为日期转换可能是查询的一部分 – DForck42
它是一个DateTime2字段。为了加入我的日历表,我将它作为DATE进行铸造。这将查询从37秒降低到2.我还没有将日历日期放在Select中运行的Selects中。我只是假设有一个更好的方法来做到这一点。 –