Benutzer mit den meisten Antworten
Spate mit Datum

Frage
-
Hallo :)
ich bräuchte eure Hilfe. Ich muss in SQL eine Spalte erstellen, welcher ich ein Datum übergebe, sodass in der Spalte dieses Datum immer um einen Tag erhöht wird. Klingt eigentlich ganz simple aber ich komme einfach gerade nicht mehr weiter.
Ich würde mich sehr über eure Hilfe freuen und jetzt schon mal ein grosses Danke :)
Antworten
-
Wenn Du eine Reihenfolge definieren kannst, sollte es auf diesem Wege gehen:
Declare @testdaten as Table(PK int, Datum date); Declare @Startdatum as Date = '20160101'; Insert into @testdaten(PK, Datum) values(10, NULL),(20, Null),(30, Null); Select *, ROW_NUMBER() OVER(ORDER BY PK) as rn, DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY PK)-1, @Startdatum) as Datum_Neu from @testdaten;
Hier noch das Update dazu:
With Vorberechung as (Select PK, DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY PK)-1, @Startdatum) as Datum_Neu from @testdaten ) update @testdaten set Datum = Datum_Neu from @testdaten T inner Join Vorberechung V on T.PK = V.PK;
Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu
- Bearbeitet Christoph Muthmann Dienstag, 10. Mai 2016 09:45 Ergänzung
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 13. Mai 2016 12:41
- Als Antwort markiert Aleksander Chalabashiev Montag, 23. Mai 2016 06:34
Alle Antworten
-
Hallo etas,
willst du alle Datumswerte der Spalte immer um einen Tag erhöhen?
update Tabelle set Spalte = dateadd(dd,1,Spalte)
Gruß Benjamin
Benjamin Hoch
MCSE: Data Platform
MCSA: Windows Server 2012
Blog- Bearbeitet Benjamin.Hoch Dienstag, 10. Mai 2016 07:28
-
Hallo!
Grundsätzlich brauchst Du ja erst mal einen Ausgangswert, der dann erhöht werden soll. Die "Zielspalte" muss natürlich vom Typ date oder datetime sein. DATEADD dürfte dann schon genügen:
SELECT DATEADD(day, 1, Zielspalte)
day = Du möchtest den Wert "Tag" erhöhen
1 = 1 Tag
Natürlich kannst Du das auch noch mit WHERE einschränken. Z.B.:
WHERE DAY(Zielspalte) = DAY(GetDate()-1)
Ich kann auch das hier empfehlen: http://www.insidesql.org/blogs/frankkalis/2010/08/19/der-ultimative-guide-fuer-die-datetime-datentypen
MCTS (70-642), MCP Please click the "Mark as Answer" or "Vote As Helpful button" if a post solves your problem or is helpful! Bitte klicke auf "Als Antwort vorschlagen" oder "Als hilfreich bewerten", wenn mein Beitrag Dein Problem löst oder hilfreich ist.
- Bearbeitet Markus Kammerer Dienstag, 10. Mai 2016 07:37 WHERE
-
Vielleicht meinst Du auch so etwas?
DECLARE @minDate date, @maxDate date; SET @minDate = '2016-01-01'; SET @maxDate = '2016-05-10'; WITH cte AS (SELECT @minDate as Date1 UNION ALL SELECT DATEADD(DAY, 1, Date1) as Date1 FROM cte WHERE Date1 < @maxDate) SELECT Date1 FROM cte ORDER BY Date1 OPTION (MAXRECURSION 0);
Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu
-
Danke für die Antworten :)
die Spalte ist zunächst leer. es soll ein Datum als Input gegeben werden wodurch dann die Spalte gefüllt wird. In jeder Zeile soll dann das Datum um einen Tag erhöht werden. DATEADD ist schon mal sehr hilfhreich :) aber wie könnte ich da noch ein Datum als Input eingeben? oder funktioiert DATEADD nur wenn in der Spalte Werte enthalten sind?
Liebe Grüsse und besten Dank
etas
-
Danke für die Antworten :)
die Spalte ist zunächst leer. es soll ein Datum als Input gegeben werden wodurch dann die Spalte gefüllt wird. In jeder Zeile soll dann das Datum um einen Tag erhöht werden. DATEADD ist schon mal sehr hilfhreich :) aber wie könnte ich da noch ein Datum als Input eingeben? oder funktioiert DATEADD nur wenn in der Spalte Werte enthalten sind?
Liebe Grüsse und besten Dank
etas
Einen "Input" erhälst Du immer vom Benutzer an der GUI (Grafischen Benutzeroberfläche). Das ist der Moment, wo Du den SQL-Server verlässt und mit C#, PHP, VB.NET oder sonst einer Programmiersprache Deiner Wahl eine Maske definierst und die Eingabe abfrägst. Alternativ geht dies noch mit Microsoft Access als Frontend für den SQL-Server (LibreOffice Base evtl. auch, aber damit habe ich mich noch nie beschäftigt).
Der SQL-Server ist "nur" für die Datenhaltung zuständig, auch wenn Du so schon sehr viel darin berechnen kannst. Zum Testen würde ich einfach mal einen Dummy-Wert von Hand eintragen und dann die gewünschten SQL-Skripte schreiben.MCTS (70-642), MCP Please click the "Mark as Answer" or "Vote As Helpful button" if a post solves your problem or is helpful! Bitte klicke auf "Als Antwort vorschlagen" oder "Als hilfreich bewerten", wenn mein Beitrag Dein Problem löst oder hilfreich ist.
-
Hallo,
du kannst der Funktion dateadd auch ein Datum angeben, aber diese Funktion mit aufsteigender Datumswerten funktioniert in einer Datenbank so nicht. Datenbanken arbeiten mit Mengen. Für den SQL Server ist die Reihenfolge von Datensätzen in der Datenbank erstmal belanglos. Es gibt nicht "den einen definierten" Nachfolgedatensatz. Zwar kann man über Clustered Indexe eine Reihenfolge definieren aber man braucht eine Spalte aus der die logische Reihenfolge hergeleitet wird. Daher kannst du nicht einfach sagen Wert = Wert(Vorgänger)+1.
Benjamin Hoch
MCSE: Data Platform
MCSA: Windows Server 2012
Blog -
Wenn Du eine Reihenfolge definieren kannst, sollte es auf diesem Wege gehen:
Declare @testdaten as Table(PK int, Datum date); Declare @Startdatum as Date = '20160101'; Insert into @testdaten(PK, Datum) values(10, NULL),(20, Null),(30, Null); Select *, ROW_NUMBER() OVER(ORDER BY PK) as rn, DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY PK)-1, @Startdatum) as Datum_Neu from @testdaten;
Hier noch das Update dazu:
With Vorberechung as (Select PK, DATEADD(DAY, ROW_NUMBER() OVER(ORDER BY PK)-1, @Startdatum) as Datum_Neu from @testdaten ) update @testdaten set Datum = Datum_Neu from @testdaten T inner Join Vorberechung V on T.PK = V.PK;
Einen schönen Tag noch, Christoph -- Data Platform MVP - http://www.insidesql.org/blogs/cmu
- Bearbeitet Christoph Muthmann Dienstag, 10. Mai 2016 09:45 Ergänzung
- Als Antwort vorgeschlagen Dimitar DenkovMicrosoft contingent staff, Administrator Freitag, 13. Mai 2016 12:41
- Als Antwort markiert Aleksander Chalabashiev Montag, 23. Mai 2016 06:34