Mit den Standardfunktionen von MySQL können Sie eine Abfrage schreiben, die eine Liste von Tagen zwischen zwei Daten zurückgibt.
Beispiel: Wenn 2009-01-01 und 2009-01-13 angegeben werden, wird eine einspaltige Tabelle mit den folgenden Werten zurückgegeben:
2009-01-01
2009-01-02
2009-01-03
2009-01-04
2009-01-05
2009-01-06
2009-01-07
2009-01-08
2009-01-09
2009-01-10
2009-01-11
2009-01-12
2009-01-13
Bearbeiten: Es scheint, ich war nicht klar. Ich möchte diese Liste generieren. Ich habe Werte in der Datenbank gespeichert (nach Datum / Uhrzeit), möchte aber, dass sie auf einem linken äußeren Join zu einer Liste von Daten wie oben zusammengefasst werden (ich erwarte für einige Tage Null von der rechten Seite einiger dieser Joins und werde dies behandeln ).
mysql
sql
date
gaps-and-islands
Gilgad
quelle
quelle
Antworten:
Ich würde diese gespeicherte Prozedur verwenden, um die Intervalle, die Sie benötigen, in die temporäre Tabelle mit dem Namen time_intervals zu generieren , dann JOIN und Ihre Datentabelle mit der temporären Tabelle time_intervals zu aggregieren .
Die Prozedur kann Intervalle aller verschiedenen Typen generieren, die darin angegeben sind:
Ähnliches Beispieldatenszenario am Ende dieses Beitrags , in dem ich eine ähnliche Funktion für SQL Server erstellt habe.
quelle
Für MSSQL können Sie dies verwenden. Es ist sehr schnell.
Sie können dies in eine Tabellenwertfunktion einschließen oder proc speichern und im Start- und Enddatum als Variablen analysieren.
quelle
Wir hatten ein ähnliches Problem mit BIRT-Berichten, da wir an jenen Tagen berichten wollten, an denen keine Daten vorhanden waren. Da es für diese Daten keine Einträge gab, bestand die einfachste Lösung für uns darin, eine einfache Tabelle zu erstellen, in der alle Daten gespeichert wurden, und diese zum Abrufen von Bereichen oder zum Verknüpfen zu Nullwerten für dieses Datum zu verwenden.
Wir haben einen Job, der jeden Monat ausgeführt wird, um sicherzustellen, dass die Tabelle 5 Jahre in der Zukunft gefüllt ist. Die Tabelle wird folgendermaßen erstellt:
Zweifellos gibt es magisch knifflige Möglichkeiten, dies mit verschiedenen DBMS zu tun, aber wir entscheiden uns immer für die einfachste Lösung. Die Speicheranforderungen für die Tabelle sind minimal und machen die Abfragen so viel einfacher und portabler. Diese Art von Lösung ist aus Sicht der Leistung fast immer besser, da keine zeilenweisen Berechnungen für die Daten erforderlich sind.
Die andere Option (und wir haben dies bereits verwendet) besteht darin, sicherzustellen, dass für jedes Datum ein Eintrag in der Tabelle vorhanden ist. Wir haben die Tabelle regelmäßig gekehrt und keine Einträge für Daten und / oder Zeiten hinzugefügt, die nicht vorhanden waren. Dies ist in Ihrem Fall möglicherweise keine Option, sondern hängt von den gespeicherten Daten ab.
Wenn Sie wirklich denken, dass es ein Ärger ist, das zu behalten
all_dates
Tabelle , ist eine gespeicherte Prozedur der richtige Weg, um einen Datensatz mit diesen Daten zurückzugeben. Dies ist mit ziemlicher Sicherheit langsamer, da Sie den Bereich bei jedem Aufruf berechnen müssen, anstatt nur vorberechnete Daten aus einer Tabelle abzurufen.Um ehrlich zu sein, können Sie die Tabelle 1000 Jahre lang ohne ernsthafte Probleme bei der Datenspeicherung ausfüllen - 365.000 16-Byte-Daten (zum Beispiel) plus einen Index, der das Datum dupliziert, plus 20% Overhead für die Sicherheit, würde ich ungefähr schätzen ungefähr 14M [365.000 * 16 * 2 * 1,2 = 14.016.000 Bytes]), eine winzige Tabelle im Schema der Dinge.
quelle
Sie können die Benutzervariablen von MySQL folgendermaßen verwenden :
@num ist -1, weil Sie es bei der ersten Verwendung hinzufügen. Außerdem können Sie "HAVING date_sequence" nicht verwenden, da dadurch die Benutzervariable für jede Zeile zweimal inkrementiert wird.
quelle
Wenn Sie eine Idee aus dieser Antwort entlehnen, können Sie eine Tabelle mit 0 bis 9 erstellen und daraus Ihre Datumsliste erstellen.
Auf diese Weise können Sie eine Liste mit bis zu 1000 Daten erstellen. Wenn Sie größer werden müssen, können Sie der inneren Abfrage einen weiteren Cross-Join hinzufügen.
quelle
date
; führt NICHT zu diesem Teil.Für den Zugriff (oder eine beliebige SQL-Sprache)
Erstellen Sie eine Tabelle mit 2 Feldern. Wir nennen diese Tabelle
tempRunDates
:--Felder
fromDate
und -toDate
Dann fügen Sie nur 1 Datensatz ein, der das Start- und das Enddatum hat.
Erstellen Sie eine weitere Tabelle:
Time_Day_Ref
--Importieren Sie eine Liste mit Daten (Liste in Excel erstellen ist einfach) in diese Tabelle.
- Der Feldname in meinem Fall ist
Greg_Dt
für Gregorianisches Datum. -Ich habe meine Liste vom 1. Januar 2009 bis zum 1. Januar 2020 erstellt.
Führen Sie die Abfrage aus:
Einfach!
quelle
Normalerweise verwendet man eine Hilfszahlentabelle, die Sie normalerweise nur für diesen Zweck aufbewahren, mit einigen Variationen davon:
Ich habe Variationen mit Tabellenwertfunktionen usw. gesehen.
Sie können auch eine permanente Liste von Daten führen. Wir haben das in unserem Data Warehouse sowie eine Liste der Tageszeiten.
quelle
Wie Sie Daten zwischen zwei angegebenen Daten in SQL Server finden, erfahren Sie unter http://ektaraval.blogspot.com/2010/09/writing-recursive-query-to-find-out-all.html
quelle
quelle
Elegante Lösung mit neuen rekursiven Funktionen (Common Table Expressions) in MariaDB> = 10.3 und MySQL> = 8.0.
Das Obige gibt eine Tabelle mit Daten zwischen '2019-01-01' und '2019-04-30' zurück.
quelle
Wir haben dies in unserem HRMS-System verwendet. Sie werden es nützlich finden
quelle
Diese Lösung funktioniert mit MySQL 5.0.
Erstellen Sie eine Tabelle -
mytable
.Das Schema ist nicht wesentlich. Was zählt, ist die Anzahl der Zeilen darin.
Sie können also nur eine Spalte vom Typ INT mit 10 Zeilen und Werten von 1 bis 10 behalten.
SQL:
Einschränkung: Die maximale Anzahl von Daten, die von der obigen Abfrage zurückgegeben werden, beträgt
(rows in mytable)*(rows in mytable) = 10*10 = 100.
Sie können diesen Bereich erhöhen, indem Sie den Formularteil in SQL ändern:
von mytable x, mytable y, mytable z
Also, der Bereich sei
10*10*10 =1000
und so weiter.quelle
Erstellen Sie eine gespeicherte Prozedur, die zwei Parameter a_begin und a_end verwendet. Erstellen Sie eine temporäre Tabelle mit dem Namen t, deklarieren Sie eine Variable d, weisen Sie d a_begin zu und führen Sie eine
WHILE
SchleifeINSERT
d in t aus und rufen Sie dieADDDATE
Funktion auf, um den Wert d zu erhöhen . EndlichSELECT * FROM t
.quelle
Ich würde etwas Ähnliches verwenden:
Dann enthält die
@HOLDER
Variablentabelle alle Daten, die zwischen diesen beiden Daten um einen Tag erhöht wurden, und kann nach Herzenslust hinzugefügt werden.quelle
Ich habe eine ganze Weile damit gekämpft. Da dies der erste Treffer bei Google ist, als ich nach der Lösung gesucht habe, möchte ich posten, wo ich bisher angekommen bin.
Ersetzen Sie
[yourTable]
durch eine Tabelle aus Ihrer Datenbank. Der Trick besteht darin, dass die Anzahl der Zeilen in der von Ihnen ausgewählten Tabelle> = die Anzahl der Daten sein muss, die zurückgegeben werden sollen. Ich habe versucht, den Tabellenplatzhalter DUAL zu verwenden, aber er hat nur eine einzelne Zeile zurückgegeben.quelle
Fügen Sie hier zuerst einen Tag zum aktuellen Enddatum hinzu, es ist 2011-02-28 00:00:00, dann subtrahieren Sie eine Sekunde, um das Enddatum 2011-02-27 23:59:59 festzulegen. Auf diese Weise können Sie alle Daten zwischen den angegebenen Intervallen abrufen.
Ausgabe:
2011/02/25
2011/02/26
2011/02/27
quelle
Bei diesem Verfahren werden alle Daten vom Anfang des Jahres bis jetzt eingefügt. Ersetzen Sie einfach die Tage "Start" und "Ende", und schon kann es losgehen!
quelle
IF a=365 THEN
von Schaltjahren beeinflusst?150
in Zeile 9? Dieser Code ist eine "pat Antwort" ohne viel tatsächliche Erklärung.Ich brauchte eine Liste mit allen Monaten zwischen zwei Daten für Statistiken. Die 2 Daten sind das Start- und Enddatum eines Abonnements. Die Liste zeigt also alle Monate und die Anzahl der Abonnements pro Monat.
MYSQL
quelle
Sie können dies verwenden
quelle
ich benutze
Server version: 5.7.11-log MySQL Community Server (GPL)
Jetzt werden wir dies auf einfache Weise lösen.
Ich habe eine Tabelle mit dem Namen "Datentabelle" erstellt.
Jetzt sehen wir die eingefügten Datensätze darin.
und hier unsere Abfrage, Datensätze innerhalb von zwei Daten anstatt dieser Daten abzurufen.
hoffe, das würde vielen helfen.
quelle