Jump to content

MSSQL Datenbank-Abfrage Datensatz für jedes Datum aus Datumsbereich

Empfohlene Beiträge

Guten Tag,

ich habe ein Problem und finde derizeit keinen Lösungsansatz.

Vereinfacht dargestellt habe ich eine Tabelle "Test" mit folgenden Feldern und Datentypen:

ID Von Bis
INT, AI DATETIME DATETIME

Ich benötige ein Ergebnis einer SQL-Abfrage welches mir zu einem Datensatz folgendes Liefert.

Beispieldatensatz in der Tabelle: 1, 01.12.2018, 02.02.2018

Das Ergebnis der Abfrage sollte wie folgt aussehen:

ID Datum Von Bis
1 01.12.2018 01.12.2018 02.02.2018
1 02.12.2018 01.12.2018 02.02.2018
1 03.12.2018 01.12.2018 02.02.2018
1 ... 01.12.2018 02.02.2018
1 02.02.2018 01.12.2018 02.02.2018

Habt Ihr einen Lösungsvorschlag bzw. Lösungsansatz?

Vielen Dank!

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Ist es gewollt, dass die ID überall gleich ist?
Woher kommt plötzlich die Spalte Datum? Soll diese gleich der Spalte "von" sein?


Ansonsten sollte ein "Select * from Test" dir ein recht ähnliches Ergebnis geben :D 
 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 40 Minuten schrieb murat1895:

Ich benötige ein Ergebnis einer SQL-Abfrage welches mir zu einem Datensatz folgendes Liefert.

Wieviel zahlst du / dein Unternehmen denn dafür? Immerhin muss hier ja 100% Fremdleistung erbracht werden. Günstig wird das wohl nicht.

 

vor 41 Minuten schrieb murat1895:

Habt Ihr einen Lösungsvorschlag bzw. Lösungsansatz?

Du hast doch sicherlich schon versucht, eine Lösung auszuarbeiten. Wie wäre es, wenn du uns diese präsentierst und wir dir bei der Korrektur behilflich sind? Das ist immerhin für dich gut - denn dadurch lernst du mehr etwas UND es kostet dich nix (siehe oben) - WIN/WIN quasi.

Ist doch doof, die anderen die Arbeit machen zu lassen..

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 20 Minuten schrieb Gottlike:

Ist es gewollt, dass die ID überall gleich ist?
Woher kommt plötzlich die Spalte Datum? Soll diese gleich der Spalte "von" sein?


Ansonsten sollte ein "Select * from Test" dir ein recht ähnliches Ergebnis geben :D 
 

Ich vermute mal, dass jeder Tag zwischen den beiden Daten ausgewiesen werden soll. Also:

ID	Datum		Von		Bis
1	01.01.2000	01.01.2000	10.01.2000
1	02.01.2000	01.01.2000	10.01.2000
1	03.01.2000	01.01.2000	10.01.2000
1	04.01.2000	01.01.2000	10.01.2000
1	05.01.2000	01.01.2000	10.01.2000
1	06.01.2000	01.01.2000	10.01.2000
1	07.01.2000	01.01.2000	10.01.2000
1	08.01.2000	01.01.2000	10.01.2000
1	09.01.2000	01.01.2000	10.01.2000
1	10.01.2000	01.01.2000	10.01.2000

Sowas ist mit reinem SQL nicht möglich, da SQL auf der Menge arbeitet, die in der Datenbank stehen. Du willst hier aber neue Zeilen dazudichten. Sowas würde höchstens mit einer Stored Procedure gehen. Ich kenne mich aber mit MS SQL nicht wirklich gut aus und weiß auch nicht, was man dort für Stored Procedure bauen könnte. Mit Oracles PL/SQL wäre es möglich.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Man kann sich als Hilfe eine Tabelle mit allen Tagen aus den umliegenden Jahren anlegen und auf diese dann joinen um die zusätzlichen Zeilen zu bekommen.

Oder man erstellt sich die Tabelle virtuell per subquery, da weiß ich aber auch nicht welche Möglichkeiten es bei MSSQL gibt.

 

Ist eigentlich klar, dass 01.12. nach dem 02.02. kommt?

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 14 Stunden schrieb Whiz-zarD:

Sowas ist mit reinem SQL nicht möglich, da SQL auf der Menge arbeitet, die in der Datenbank stehen.

Das geht schon, wenn man sog. "Set Returning Functions" hat, z.B. generate_series bei PostgreSQL.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Ist die Vermutung von @Whiz-zarD richtig?

Dann geht es z.B. mit einer While Schleife:

@x=0

while (select datumvon + X from tabelle) <= select datumbis from tabelle

begin

{

do something

x++

}

End

 

Ja MS-SQL kann Schleifen. :)

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

@Whiz-zarD

Deine Vermutung ist korrekt. Ja das mit der Stored Procedure hatte ich mir schon angesehen.

Vom Prinzip her würde das so aussehen:

DECLARE @Datum1 DATE, @Datum2 DATE
SET @Datum1 = '20180301'
SET @Datum2 = '20180330'

SELECT DATEADD(DAY,number+1,@Datum1) [Date]
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number+1,@Datum1) < @Datum2

Das Problem ist nur, das ich hier Parameter angeben muss Datum1 und Datum2.

vor 14 Stunden schrieb PVoss:

Ist eigentlich klar, dass 01.12. nach dem 02.02. kommt?

... ups, beim letzteren sollte 2019 stehen...

vor 34 Minuten schrieb Enno:

Ist die Vermutung von @Whiz-zarD richtig?

Dann geht es z.B. mit einer While Schleife:

@x=0

while (select datumvon + X from tabelle) <= select datumbis from tabelle

begin

{

do something

x++

}

End

 

Ja MS-SQL kann Schleifen. :)

Ich werde mir das mal ansehen.

Ich habe das Problem nun anders gelöst. Die bestehende Webanwendung die das gesuchte Ergebnis darstellen sollte bietete fertige Elemente, wo einfach die SQL-Abfrage hinterlegt werden kann, deshalb war ich auf der Suche nach dieser SQL-Abfrage. In dieser Webanwendung habe ich auch die Möglichkeit mit JavaScript zu arbeiten. Deshalb hole ich mir derzeit nur einen Datensatz aus der Tabelle "Test", den ich dann entsprechend mit JavaScript aufbereite.

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen
vor 16 Minuten schrieb murat1895:

@Whiz-zarD

Deine Vermutung ist korrekt. Ja das mit der Stored Procedure hatte ich mir schon angesehen.

Vom Prinzip her würde das so aussehen:


DECLARE @Datum1 DATE, @Datum2 DATE
SET @Datum1 = '20180301'
SET @Datum2 = '20180330'

SELECT DATEADD(DAY,number+1,@Datum1) [Date]
FROM master..spt_values
WHERE type = 'P'
AND DATEADD(DAY,number+1,@Datum1) < @Datum2

Das Problem ist nur, das ich hier Parameter angeben muss Datum1 und Datum2.

Wie gesagt, ich kenne mich mit MS SQL nicht aus, da ich hauptsächlich mit Oracle Database zu tun habe. Dort gibt es die sog. Table Functions. Also eine Funktion, in der du Parameter reinreichen kannst und dir eine Tabelle zurückliefert. Unter MS SQL scheint sowas unter dem Begriff "Table-Valued Functions" zu geben.

https://www.codeproject.com/Articles/167399/Using-Table-Valued-Functions-in-SQL-Server

 

Diesen Beitrag teilen


Link zum Beitrag
Auf anderen Seiten teilen

Erstelle ein Benutzerkonto oder melde dich an, um zu kommentieren

Du musst ein Benutzerkonto haben, um einen Kommentar verfassen zu können

Benutzerkonto erstellen

Neues Benutzerkonto für unsere Community erstellen. Es ist einfach!

Neues Benutzerkonto erstellen

Anmelden

Du hast bereits ein Benutzerkonto? Melde dich hier an.

Jetzt anmelden

Fachinformatiker.de, 2018 SE Internet Services

fidelogo_small.png

if_icon-6-mail-envelope-closed_314900.pnSchicken Sie uns eine Nachricht!

Fachinformatiker.de ist die größte IT-Community
rund um Ausbildung, Job, Weiterbildung für IT-Fachkräfte.

Fachinformatiker.de App


Get it on Google Play

Kontakt

Hier werben?
Oder senden Sie eine E-Mail an

Social media u. feeds

Jobboard für Fachinformatiker und IT-Fachkräfte

×

Wichtige Information

Fachinformatiker.de verwendet Cookies. Mehr dazu in unserer Datenschutzerklärung