Zum Inhalt springen
View in the app

A better way to browse. Learn more.

Fachinformatiker.de

A full-screen app on your home screen with push notifications, badges and more.

To install this app on iOS and iPadOS
  1. Tap the Share icon in Safari
  2. Scroll the menu and tap Add to Home Screen.
  3. Tap Add in the top-right corner.
To install this app on Android
  1. Tap the 3-dot menu (⋮) in the top-right corner of the browser.
  2. Tap Add to Home screen or Install app.
  3. Confirm by tapping Install.

Empfohlene Antworten

Veröffentlicht

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!

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..

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.

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?

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.

  • Autor

@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.

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

 

Erstelle ein Konto oder melde dich an, um einen Kommentar zu schreiben.

Configure browser push notifications

Chrome (Android)
  1. Tap the lock icon next to the address bar.
  2. Tap Permissions → Notifications.
  3. Adjust your preference.
Chrome (Desktop)
  1. Click the padlock icon in the address bar.
  2. Select Site settings.
  3. Find Notifications and adjust your preference.