none
Spate mit Datum RRS feed

  • 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 :)  

    Dienstag, 10. Mai 2016 07:02

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


    Dienstag, 10. Mai 2016 09:43

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


    Dienstag, 10. Mai 2016 07:20
  • 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

    Gruß, Markus


    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.


    Dienstag, 10. Mai 2016 07:21
  • 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

    Dienstag, 10. Mai 2016 07:43
  • 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

    Dienstag, 10. Mai 2016 08:48
  • 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.

    Dienstag, 10. Mai 2016 09:09
  • 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

    Dienstag, 10. Mai 2016 09:18
  • 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


    Dienstag, 10. Mai 2016 09:43