Datum weiterzählen



  • Hallo, ich habe eine Tabelle mit drei Feldern (id[int], userid[int], date[datum]). Nun möchte ich per Cronjob jeden Tag für jede userid einen neuen Datensatz anlegen. Soweit kein Problem. Dabei soll sich aber date pro userid um einen Tag erhöhen. Weiß jemand ob das mit SQL-Mitteln geht?



  • Mit SQL nicht.

    Jedes RDBMS hat aber seine Bordmitteln dafür.

    MySQL: Auszug aus der Onlinedocu

    DATE_ADD(datum,INTERVAL ausdruck typ) , DATE_SUB(datum,INTERVAL ausdruck typ) , ADDDATE(datum,INTERVAL ausdruck typ) , SUBDATE(datum,INTERVAL ausdruck typ)

    Diese Funktionen führen Datumsberechnungen durch. Sie wurden in MySQL-Version 3.22 eingeführt. ADDDATE() und SUBDATE() sind Synonyme für DATE_ADD() und DATE_SUB().

    In MySQL-Version 3.23 können Sie + und - anstelle von DATE_ADD() und DATE_SUB() benutzen, wenn der Ausdruck auf der rechten Seite eine DATE oder DATETIME-Spalte ist (siehe Beispiel).

    datum ist ein DATETIME- oder DATE-Wert, der das Anfangsdatum festlegt. ausdruck ist ein Ausdruck, der den Intervallwert festlegt, der zum Anfangsdatum hinzugezählt oder von diesem abgezogen wird. ausdruck ist eine Zeichenkette; sie kann mit einem '-' für negative Intervalle beginnen. typ ist ein Schlüsselwort, das angibt, wie der Ausdruck interpretiert werden soll.

    Die verwandte Funktion EXTRACT(typ FROM datum) gibt das 'typ'-Intervall des Datums zurück.

    Folgende Tabelle zeigt, in welchem Zusammenhang die typ- und ausdruck-Argumente stehen:
    typ wert erwartet ausdruck format
    SECOND Sekunden
    MINUTE Minuten
    HOUR Stunden
    DAY Tage
    MONTH Monate
    YEAR Jahre
    MINUTE_SECOND "Minuten:Sekunden"
    HOUR_MINUTE "Stunden:Minuten"
    DAY_HOUR "Tage Stunden"
    YEAR_MONTH "Jahre-Monate"
    HOUR_SECOND "Stunden:Minuten:Sekunden"
    DAY_MINUTE "Tage Stunden:Minuten"
    DAY_SECOND "Tage Stunden:Minuten:Sekunden"

    MySQL erlaubt beliebige Satzzeichen-Begrenzer im ausdruck-Format. Die in der Tabelle gezeigten Begrenzer sind Vorschläge. Wenn das datum-Argument ein DATE-Wert ist und Ihre Berechnungen nur YEAR, MONTH und DAY-Anteile beinhalten (also keine Zeit-Anteile), ist das Ergebnis ein DATE-Wert. Ansonsten ist das Ergebnis ein DATETIME-Wert:

    mysql> SELECT "1997-12-31 23:59:59" + INTERVAL 1 SECOND;
    -> 1998-01-01 00:00:00
    mysql> SELECT INTERVAL 1 DAY + "1997-12-31";
    -> 1998-01-01
    mysql> SELECT "1998-01-01" - INTERVAL 1 SECOND;
    -> 1997-12-31 23:59:59
    mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
    INTERVAL 1 SECOND);
    -> 1998-01-01 00:00:00
    mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
    INTERVAL 1 DAY);
    -> 1998-01-01 23:59:59
    mysql> SELECT DATE_ADD("1997-12-31 23:59:59",
    INTERVAL "1:1" MINUTE_SECOND);
    -> 1998-01-01 00:01:00
    mysql> SELECT DATE_SUB("1998-01-01 00:00:00",
    INTERVAL "1 1:1:1" DAY_SECOND);
    -> 1997-12-30 22:58:59
    mysql> SELECT DATE_ADD("1998-01-01 00:00:00",
    INTERVAL "-1 10" DAY_HOUR);
    -> 1997-12-30 14:00:00
    mysql> SELECT DATE_SUB("1998-01-02", INTERVAL 31 DAY);
    -> 1997-12-02

    Wenn Sie einen Intervallwert angeben, der zu kurz ist (nicht alle Intervall-Anteile beinhaltet, die vom typ-Schlüsselwort erwartet werden), nimmt MySQL an, dass Sie den äußersten linken Teil des Intervallwerts ausgelassen haben. Wenn Sie beispielsweise einen typ DAY_SECOND angeben, wird vom Wert von ausdruck erwartet, dass dieser Tages-, Stunden-, Minuten- und Sekunden-Anteile enthält. Wenn Sie einen Wert wie "1:10" angeben, nimmt MySQL an, dass die Tages- und Stunden-Anteile fehlen und der Wert Minuten und Sekunden darstellt. Mit anderen Worten wird "1:10" DAY_SECOND so interpretiert, dass es äquivalent zu "1:10" MINUTE_SECOND ist. Das ist analog zur Weise, wie MySQL TIME-Werte interpretiert, die eher vergangene Zeit als Tageszeit darstellen.

    Beachten Sie, dass ein Datumswert automatisch in einen DATETIME-Wert umgewandelt wird, wenn Sie einen DATE-Wert zu etwas hinzuzählen oder von etwas abziehen, das einen Zeit-Anteil hat:

    mysql> select date_add("1999-01-01", interval 1 day);
    -> 1999-01-02
    mysql> select date_add("1999-01-01", interval 1 hour);
    -> 1999-01-01 01:00:00

    Wenn Sie wirklich falsche Datumsangaben benutzen, ist das Ergebnis NULL. Wenn Sie MONTH, YEAR_MONTH oder YEAR hinzuzählen und das Datumsergebnis einen Tag hat, der größer ist als der höchste Tag für den neuen Monat, wird der Tag auf den höchsten Tag des neuen Monats angepasst:

    mysql> select DATE_ADD('1998-01-30', Interval 1 month);
    -> 1998-02-28

    Beachten Sie, dass das Wort INTERVAL und das typ-Schlüsselwort in den vorstehenden Beispielen nicht von der verwendeten Groß-/Kleinschreibung abhängen.


Anmelden zum Antworten