2016-11-07 2 views
0

ich eine Abfrage übergeben wurde, die vier Versionen dieser Abfrage in der select-Klausel oben hatWie kann ich die MM/DD, die samstags für die letzten 30 Tage waren

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, 

Diese besondere Abfrage spuckt diese 10/08 ; 10/29; 10/15; 10/22 in die SAMSTAGS Spalte.

Mein erster Schritt war es, eine Kalender-Tabelle in die JOIN-Verbindung zu bringen.

INNER JOIN Reference.Calendar CAL 
ON CAL.CalendarDTS  = CAST(ADT.EffectiveDTS AS DATE) 

Ich war nicht sicher, ob das Datetime-Feld Gießen effizient wäre aber mit einem Index zum Zeitpunkt der Abfrage von 35 Sekunden bis 1 für 18K Reihen fallen gelassen, die sechs Tage der Daten ist.

Ich war überrascht über diese Verbesserung, aber dann lief ich es zurück bis Januar 2015. Das veranlasste mich, die Abfrage nach etwa 10 Minuten zu töten. Ich weiß, dass diese oberen Select-Anweisungen Probleme verursachen, mein Ausführungsplan ist abscheulich.

So jetzt versuche ich über den besten Weg nachzudenken, diese Abfragen zu ersetzen. Zu Ihrer Information: Ich bin aufgrund des Tools, das meine Firma verwendet, darauf beschränkt, eine Ansicht zu verwenden. Sonst bin ich mir sicher, dass ich viel besser mit einem Proc umgehen könnte.

+0

Was ist der Datentyp für EffectiveDTS? es als ein Datum zu werfen ist wahrscheinlich Teil dessen, was Ihre Abfrage – DForck42

+0

tötet Es ist ein DateTime2-Feld. Ich habe es als DATUM gecastet, um mich meinem Kalendertisch anzuschließen. Das hat die Abfrage von 37 Sekunden auf 2 heruntergezählt. Ich muss noch das Kalenderdatum in die Selects setzen, die in der Hauptauswahl ausgeführt werden. Ich nahm nur an, dass es einen besseren Weg dafür gibt. –

Antwort

0

Wenn Sie Samstagen müssen von den letzten 30 Tage, dann können Sie wie eine Abfrage etwas verwenden ....

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' 

Ich habe es parametriert, nur so können Sie es mehr als nur das heutige Datum verwenden.

+0

Ich versuche herauszufinden, wie man diese Daten so dreht, dass sie in einem sind; getrennte Liste und binden sie auch unabhängig vom Datum an die Zeile. Wenn meine Zeile ein Datum vom 2012-01-01 hat, gibt sie diese Werte ohne den Parameter zurück. @Date –

+0

@ user385605 dann müssen Sie Ihre Frage aktualisieren, da das überhaupt nicht offensichtlich ist – DForck42

Verwandte Themen