2016-10-10 4 views
1

Die meisten Händler verwenden einen Merch-Kalender für ihren Verkaufsbericht, der ihnen helfen kann, denselben Tag in der gleichen Woche für das aktuelle Jahr und das vorherige Jahr zu finden.Wie vergleichen Sie denselben Tag in derselben Woche für das aktuelle Jahr und das vorherige Jahr?

Zum Beispiel heute ist '2016-10-10' Montag. Für das Vorjahr; 2015, für dieselbe Woche, Montag ist '2015-10-12'.

Wie können wir dies über Abfrage bei SQL abfangen und in einer Tabelle anzeigen?

+0

In Datenbankarbeit, * gleiche Woche letztes Jahr * ist ein Fuzzy-Begriff. Es gibt mehr als eine Möglichkeit zu definieren, wie Wochen auf ein Kalenderjahr fallen. SQL Server verfügt über eine Funktion [SAMEPERIODLASTYEAR] (https://msdn.microsoft.com/en-us/library/ee634972.aspx), die gut zu wissen ist, die aber möglicherweise nicht ganz Ihren Vorstellungen entspricht. –

+0

Was bedeutet * gleiche Woche * für dich? Fragen Sie zum Beispiel nach der zweiten Oktoberwoche in verschiedenen Jahren? –

Antwort

2

Sie haben alle date functions es mit langen Weg zu tun:

Oder-Verknüpfung nur Substraktion 52 Wochen es ist genug für Sie:

DATEADD(week, -52, some_Date) 
+0

Ihre Verknüpfung setzt jedes Jahr 52 Wochen voraus. – Twinkles

+0

@Twinkles, ja, denn das sage ich * 'wenn es für dich reicht' * – danihp

+0

@danihp, das reicht mir eigentlich nicht. Wie Twinkles erwähnt, muss ich auch das Schaltjahr fangen. –

0
SELECT t1.data AS data1, t1.date AS date1, 
    t2.data AS data2, t2.date AS date2 
FROM table t1 
LEFT OUTER JOIN table t2 
    ON (DATEPART(week,t1.date) = DATEPART(week,t2.date) 
    AND DATEPART(weekday,t1.date) = DATEPART(weekday,t2.date)) 
WHERE DATEPART(year,t1.date) = 2016 
     AND DATEPART(year,t2.date) = 2015 

Wenn diese Abfrage zu langsam ist, können Sie es mithilfe von berechneten Spalten unterstützen können:

ALTER TABLE table ADD year AS DATEPART(year,date) PERSISTED; 
ALTER TABLE table ADD week AS DATEPART(week,date) PERSISTED; 
ALTER TABLE table ADD weekday AS DATEPART(weekday,date) PERSISTED; 

CREATE INDEX idx_datecalc ON table (year, week, weekday); 

Und jetzt anpassen oben Abfrage:

[...] 
LEFT OUTER JOIN table t2 
    ON (t1.week = t2.week) ...etc. 
+0

Danke für deine Antwort eigentlich scheint es in Ordnung, aber ich hatte eine wirklich große Daten und diese Abfrage arbeitet rund 4 Stunden oder so .. Ich brauche eine Steigerung der Leistung. Haben Sie einen Vorschlag, das zu tun? –

+0

Haben Sie den Funktionsindex erstellt, den ich vorgeschlagen habe? – Twinkles

+0

Nein, weil ich weiß, gut genug, dass .. –

Verwandte Themen