如何显示过去30天的星期六MM / DD

时间:2016-11-07 22:36:01

标签: sql-server

我在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。

做得更好

1 个答案:

答案 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'

我已对其进行了参数设置,因此您可以使用它而不仅仅是今天的日期。