So erzeugen Sie eine Reihe von Daten in SQL Server
Den Titel nicht ganz erfassen, was ich meine, und dies ist möglicherweise ein Duplikat.
Hier ist die lange version: da ein Gast die Namen, deren Datum der Registrierung und der checkout-Datum, wie erstelle ich eine Zeile für jeden Tag, dass Sie ein Gast?
Ex: Bob prüft in 7/14 und Blätter 7/17. Ich will
('Bob', 7/14), ('Bob', 7/15), ('Bob', 7/16), ('Bob', 7/17)
als mein Ergebnis.
Dank!
- Schau mal hier stackoverflow.com/questions/1478951/... [1]: stackoverflow.com/questions/1478951/...
- In der Regel werden Sie nicht. Sie haben eine look-up-Tabelle und nehmen Sie Sie von dort.
WHERE calendar.date >= user.start_date AND calendar.date <= user.leave_date
Sie generieren KÖNNEN, setzt die Verwendung von Schleifen oder rekursiven Abfragen, aber Sie sind nie so schnell wie mit einem look-up-Tabelle. - Ich fragte eine sehr ähnliche Frage, aber mir war Stunden, nicht Tage. Sie könnte sich ändern, um Ihren Bedarf zu passen, ziemlich leicht. stackoverflow.com/questions/10986344/...
- Bitte geben Sie die SQL Server-version. Ich habe eine Lösung, hängt von der SQL Server 2008; Sie können voneinander abweichen, wenn Sie SQL Server 2005 verwenden.
- Das ist eine gute Antwort. Ich hatte gehofft, dass es eine Sprache konstruieren, in SQL, die es einfach zu erstellen ein Angebot.
- Ich meinte nichts für ungut. Wirklich. meta.stackexchange.com/q/122986/133242
- Wenn ich hatte es leicht-aber-nicht-ganz-funktionierenden code würde ich haben Sie. Wie es war, jedoch war ich eine Zeichnung komplett leer für etwa fünfzehn Minuten, bevor ich beschloss, die Frage zu stellen. SQL set-basierten Paradigma ist mehr Fremd, meine Art des Denkens über die Dinge als in einer prozeduralen Sprache oder funktionale Sprache, und manchmal habe ich nicht einmal wissen, wo zu beginnen. Daher, das fehlen von selbst-etwas-arbeiten-code.
- mögliche Duplikate von SQL Server 2008 Erzeugen eine Reihe von Datums-Zeiten
Du musst angemeldet sein, um einen Kommentar abzugeben.
Ich würde behaupten, dass für diesen Zweck die folgenden Abfrage die in etwa so effizient wie die Verwendung eines dedizierten lookup-Tabelle.
Ergebnisse:
Vermutlich müssen Sie diese als set, nicht für ein einzelnes Mitglied, so ist hier ein Weg zur Anpassung dieser Technik:
Ergebnisse:
Als @Dems wies darauf hin, könnte dies vereinfacht werden zu:
WHERE n < = (SELECT MAX())
was bedeutet, dass dies kann noch weiter vereinfacht...WITH natural AS (SELECT ROW_NUMBER() OVER (ORDER BY id) - 1 AS val FROM sys.objects) SELECT t.Member, DATEADD(DAY, natural.val, t.start) FROM @t AS t INNER JOIN natural ON natural.val <= DATEDIFF(DAY, t.start, t.end)
[Aber, auch, dann, einer geraden look-up-Tabelle ist immer noch mit weniger CPU-Zyklen zumindest.]TOP
gegensys.all_objects
. Du hast Recht, dass es vereinfacht werden könnte.Ich in der Regel tun dies mit einem trick mit row_number() auf einem Tisch. Also:
Die Berechnung seq geht ziemlich schnell, da keine Berechnung oder der Bestellung erforderlich ist. Jedoch, Sie müssen sicher sein, der Tisch ist groß genug für alle Zeit umfasst.
Wenn Sie einen "Tally" oder "Nummern" - Tabelle, Leben bekommen, ist echt einfach für Dinge wie diese.
Hier ist, wie zu bauen "Tally" - Tabelle.
Weitere Informationen darüber, was eine "Tally" - Tabelle wird in SQL und wie kann es verwendet werden, zu ersetzen, While-Schleifen und die "Versteckten RBAR" von reursive Allgemeine Tabellenausdrücke sind, die zählen, finden Sie im folgenden Artikel.
http://www.sqlservercentral.com/articles/T-SQL/62867/
Dies kann arbeiten für ya:
Ich würde erstellen Sie einen trigger zu erstellen, die zusätzlichen Datensätze und führen Sie es auf der Kasse. Alternativ können Sie auch eine tägliche Mitternacht job das gleiche zu tun (wenn Sie brauchen up-to-date Informationen in Ihrer Datenbank).