SQL für die letzten sechs "vollen" Monaten
Ich habe Tabelle, die eine datetime-Spalte. Ich brauche für die Rückgabe von Zeilen nur für die letzten 6 Monate. Diese kann getan werden, indem
WHERE CloseTime >= DATEADD(Month, DATEDIFF(Month, 0, DATEADD(m, - 6, CURRENT_TIMESTAMP)), 0)
Dieser bekommt von mir die Daten für den Monat bin ich angefangen dieses Skript + Letzte 6 Monate. Also wenn ich z.B. dieses Skript ausführen heute, Ill Holen Sie sich die Daten für diesen Monat + alle vorherigen Monate bis April (04).
Nun muss ich ändern, die Bedingung also, wenn ich das Skript heute, die Daten werden nur zu erhalten, für Monate 03-09 nur, exluding Tage in diesem Monat (10).
Jede Beratung, bitte?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn Sie wollen, um die letzten 6 Monate, unabhängig davon, ob heute der 1., 3., 9., 29., was auch immer, dann einfach subtrahieren Sie 7 Monate. Hier ist ein Weg, das zu tun: Holen Sie sich die erste des Monats in eine variable, dann verwenden Sie einen offenen Bereich in der Abfrage.
Könnten Sie auch
0
im Ort'19000101'
aber ich bevorzuge, dass ein explizites Datum als implizite Kurzschrift (es war eine sehr harte Gewohnheit zu brechen).Wenn Sie wirklich nicht, wie Variablen, dann kannst du die Abfrage sehr viel komplexer, durch die Wiederholung des Ausdrucks zu berechnen, der erste dieses Monats (und in den Anfang des Bereichs, subtrahieren 7 von der Reihe der Monate):
Igitt. Variablen machen dieses viel aufgeräumter.
Beim erstellen von Abfragen, die Sie nicht verwenden möchten, eine Funktion auf die Spalte suchen, da dies resultiert in einem full table scan.
Die Lösung funktioniert und abholen sollte jeder index auf CloseTime.
Wenn die Tabelle klein ist und ein full table scan ist kein Problem, eine einfache Lösung ist die Verwendung der MONTH-Funktion.
03-01-2013
1. März oder 3. Jan?), Ich denke, dies wird abgedeckt in falsche Handhabung von Datums - /range-Anfragen. Beide Artikel auch lesenswert und mit freundlicher Genehmigung von Aaron Bertrand.DATEADD(d, +1, '09-20-2013')
warum nicht einfach schreiben09-21-2013
(abgesehen von der Tatsache sollte es sein, die Kultur invariante20130921
).Schaute ich Aaron ' s Artikel. Das ist ein sehr gutes Lesen.
Fragte ich mich, ob es irgendeine neue Funktion, wurde nicht getestet, da Artikel.
Wenn Sie mit 2012, warum nicht verwenden Sie die format-Funktion? Logisch, Sie wollen Datums-Variablen mit einem Tag 01. Der Abfrage-plan wird immer noch ein "clustered index scan".
Lassen Sie uns sehen, wie diese Lösung stacks up mit Aaron ' s test-Datenbank.
Lets make 1000 Aufrufe der Funktionen.
Hier sind die Ausführungen Zeiten.
Zusammenfassend ein Aufruf der neuen Funktion format() und einen impliziten cast zu einem kleinen date Zeit nimmt ein wenig mehr Zeit als eine dateadd() und datediff() mit zwei string - (Datum) - Literale.
Die format () - Lösung scheint mehr intuitiv oder selbst dokumentieren zu mir. Der Zeitunterschied Betrug 3,3 versus 3.0 Sek.
Ich den speed-test einen Sieg, um Aaron ' s Lösung. Stick mit in-Vergleiche auf Gleichheit von date-Variablen. Sie sind schneller.
Kurz, ich muss fix meine schlechte Gewohnheiten.
FORMAT()
als ein Anwärter - würde verzerrt haben alle meine Grafiken, die ich denke.