2016-11-07 68 views
0

有人递给我有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做得更好。

+0

EffectiveDTS的数据类型是什么?将它作为日期转换可能是查询的一部分 – DForck42

+0

它是一个DateTime2字段。为了加入我的日历表,我将它作为DATE进行铸造。这将查询从37秒降低到2.我还没有将日历日期放在Select中运行的Selects中。我只是假设有一个更好的方法来做到这一点。 –

回答

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' 

我已经参数化了,只是让你可以使用它不仅仅是今天的日期等等。

+0

我想弄清楚如何将这些日期转换为它们在;不管日期如何,都将它们绑定到行。所以如果我的行有一个2012-01-01的日期,它会返回那些没有参数的值。 @Date –

+0

@ user385605那么你需要更新你的问题,因为这根本不明显 – DForck42

相关问题