SQL: Wo zwischen zwei Daten ohne Jahr?

8

Ich versuche, historische Daten abzufragen, und ich muss nur Daten aus einem Zeitraum von 1 Monat zurückgeben: 2 Wochen zurück und 2 Wochen vor, aber ich brauche das Jahr, um egal zu sein.

Also, wenn ich heute die Abfrage machen würde, würde ich alle Zeilen mit date zwischen xxxx-06-31 und xxxx-07-27

wollen

Vielen Dank im Voraus für die Hilfe!

BEARBEITEN: Ich habe es auf zwei Arten versucht. beide, glaube ich, werden um das neue Jahr nicht funktionieren. Einer besteht darin, einen Datumsteil (Tag) zu verwenden, und der andere wäre, einfach das Jahr des Datums zu nehmen und zu vergleichen.

    
Patrick 14.09.2012, 01:39
quelle

3 Antworten

7

Der beste Weg, um über dieses Problem nachzudenken, besteht darin, Ihre Daten in eine Zahl zwischen 0 und 365 zu konvertieren, die dem Tag im Jahr entspricht. Dann wählen Sie einfach Daten, wo diese Differenz weniger als 14 ist, erhalten Sie Ihr zweiwöchiges Fenster.

Das wird am Anfang oder Ende des Jahres zusammenbrechen. Aber einfache modulare Arithmetik gibt Ihnen die Antwort.

Glücklicherweise hat MySQL DAYOFYEAR(date) , also ist es nicht so kompliziert:

%Vor%

Diese zusätzliche + 365 wird benötigt, da MySQL MOD negative Zahlen zurückgibt.

Diese Antwort berücksichtigt Schaltjahre nicht korrekt. Wenn das aktuelle Jahr kein Schaltjahr ist und der Kalender innerhalb von 14 Tagen nach Ende des Jahres liegt, dann werden Sie einen Tag im Januar verpassen, den Sie hätten einplanen sollen. Wenn Sie sich darum kümmern, sollten Sie 365 durch [the number of days in the year - 1 ] ersetzen.

    
mdahlman 14.09.2012, 03:43
quelle
6

Angenommen, Sie haben ein solches Datum,

%Vor%

Versuchen Sie diese Abfrage unten,

%Vor%

SQLFiddle-Demo

    
John Woo 14.09.2012 02:11
quelle
2

Ist es in Ordnung, wenn die Lösung schrecklich langsam ist?

%Vor%

Das berechnet alle Mittelpunkte für alle Jahre im Datensatz und zieht dann Datensätze + - 2 Wochen von einem solchen Mittelpunkt, der das Ende des Jahres behandelt.

Die COALESCE behandelt 02-29 an Jahren ohne Schalttag (wobei MySQL NULL-ify ist) und zwingt es auf 02-28 herunter.

    
pilcrow 14.09.2012 02:41
quelle

Tags und Links