phpmyadmin. Termine von 2017 auf 2018 übertragen

THOMASBAUER.cc

Cadet 4th Year
Registriert
Aug. 2007
Beiträge
86
Hey liebe Computerbase-Community,


ich habe für eine Webseite einen Sportkalender mit über 5.000 Events.
Nun möchte ich mittels SQL-Befehl die Termine aus dem Jahr 2017 automatisch in das Jahr 2018 übertragen.
Da die meisten Termine der Events in der selben Kalenderwoche wie im Vorjahr stattfinden, müsste ich nur den Termin von 2017 nehmen und davon einen Tag abziehen.

Also ein Event das am 10.10.2017 stattgefunden hat, soll für 2018 das Datum 09.10.2018 haben. Heißt, vereinfacht gesagt: Einfach 364 Tage dazuzählen.

Ich habe zwei Felder:
jr_datum: Gibt das Datum von 2017 aus
jr_datum2018: Gibt das Datum von 2018 aus

Die Tabelle lautet: xx_jreviews_content

Die Felder sind vom Typ "datetime", also kein Timestamp.
Bei jr_datum steht somit z.B: "2017-10-10 00:00:00 drinnen (Uhrzeit ist immer 00:00:00, hat aber keine Relevanz)

Wie kann ich nun die Termine von 2017 automatisch auf 2018 übertragen? Ich habe gelesen das da eine DATE_ADD Funktion hilft.

Ich nehme mal an dafür sollte sich schon eine Formel zusammenbastlen lassen?



Allerdings wird die Sache etwas komplizierter, den ich will zu der Abfrage einige Regeln miteinbauen:

* Wenn im Feld "jr_datum2018" bereits ein Termin eingetragen ist, wird diese Formel nicht angewandt. Das heißt nur wenn im Feld "jr_datum2018" "0000-00-00 00:00:00" eingetragen ist, soll diese Anweisung gültig sein. Das liegt daran, das ich von einigen Events schon vorab manuell den Termin für 2018 eingetragen habe.

* Da natürlich nicht bei allen Events dann tatsächlich der Termin zu diesem Tag stattfindet (z.B. ein Silvesterlauf findet immer am 31.12 statt und nicht dann wie bei dieser Formel am 30.12. Zudem gibt es auch Veranstaltungen die natürlich nicht in exakt der gleichen Woche wie im Vorjahr ausgetragen werden) , habe ich ein VARCHAR(255) Feld mit dem Namen "jr_terminoffen2018". Alle Termine die mittels dieser Anweisung für 2018 festgelgt wurden, sollen in diesem Feld den Wert "*ja*" erhalten.
Zur Erklärung: Im Backend meiner Webseite ist das eine Checkbox. Wenn ich da bei dem Termin ein Häckchen setze, wird im Frontend der Text ausgegeben das der Termin noch nicht offziell bestätigt ist, sondern nur eine Prognose anhand des Vorjahrestermins.

* Ich nehme mal an, man kann keine Ausnahmen bei dieser Abfrage einfügen? Also das alle Events mit Termin 31.12.2017 bei jr_datum für 2018 (jr_datum2018) den Termin 31.12.2018 erhalten und nicht 30.12.2018... Das gleiche z.B. am 3.10 (Tag der Deutschen Einheit) oder am 26.10 (Österreichische Nationalfeiertag) oder auch am Ostermontag (da müsste dann die events vom 17. April 2017 auf 2. April 2018 übertragen werden)...

So das wars aber, vielleicht kann sich ja ein SQL-Experte die Zeit nehmen und mir beim Zusammenbasteln der Formel helfen :)

LG
 
Zuletzt bearbeitet:
Das DATE_ADD kann man in diesem Fall auch weglassen. Die Ausnahmen kannst Du in der WHERE-Klausel (NOT IN) integrieren.
Code:
UPDATE `xx_jreviews_content` 
SET `jr_datum2018` = `jr_datum` + INTERVAL 364 DAY, 
    `jr_terminoffen2018` = '*ja*'
WHERE `jr_datum2018` = '0000-00-00 00:00:00' 
AND DATE(`jr_datum`) NOT IN ('2017-12-31', '2017-10-03', '2017-10-26', '2017-04-17')
 
Andreas_ schrieb:
Das DATE_ADD kann man in diesem Fall auch weglassen. Die Ausnahmen kannst Du in der WHERE-Klausel (NOT IN) integrieren.
Code:
UPDATE `xx_jreviews_content` 
SET `jr_datum2018` = `jr_datum` + INTERVAL 364 DAY, 
    `jr_terminoffen2018` = '*ja*'
WHERE `jr_datum2018` = '0000-00-00 00:00:00' 
AND DATE(`jr_datum`) NOT IN ('2017-12-31', '2017-10-03', '2017-10-26', '2017-04-17')

Wow, es kann manchmal so einfach sein. Danke Andreas :)
Ergänzung ()

Nun habe ich doch noch ein Problem bei den nationalen Feiertagen.
Z.B. Schweizer Feiertag ist jedes Jahr am 1.8.
Demnach möchte ich das bei Events in der Schweiz immer der 1.8 bleibt und bei allen anderen Ländern ein Tag weniger gewählt wird.

Ich habe es damit versucht:

Code:
/* Ausnahme Schweizer Nationalfeiertag (immer 1.8 - NUR SCHWEIZ) */
    UPDATE `xx_jreviews_content` 
    SET `jr_datum2018` = '2018-08-01 00:00:00', 
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00' 
    AND `jr_datum` = '2017-08-01 00:00:00'
    AND `jr_land` = '*schweiz*';

/* Ausnahme Schweizer Nationalfeiertag (immer 1.8 - ALLE ANDEREN LÄNDER) */
    UPDATE `xx_jreviews_content` 
    SET `jr_datum2018` = '2017-07-31 00:00:00', 
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00' 
    AND `jr_datum` = '2017-08-01 00:00:00'
    NOT `jr_land` = '*schweiz*'

Allerdings hat diese SQL-Abfrage nicht funktioniert

#1064 - Fehler in der SQL-Syntax. Bitte die korrekte Syntax im Handbuch nachschlagen bei '`jr_land` = '*schweiz*'' in Zeile 6

Bei Zeile 6 ist der NOT Befehl gemeint.

EDIT: Gelöst

Code:
/* Ausnahme Schweizer Nationalfeiertag (immer 1.8 - NUR SCHWEIZ) */
    UPDATE `xx_jreviews_content` 
    SET `jr_datum2018` = '2018-08-01 00:00:00', 
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00' 
    AND `jr_datum` = '2017-08-01 00:00:00'
    AND `jr_land` = '*schweiz*';

/* Ausnahme Schweizer Nationalfeiertag (immer 1.8 - ALLE ANDEREN LÄNDER) */
    UPDATE `xx_jreviews_content` 
    SET `jr_datum2018` = '2017-07-31 00:00:00', 
        `jr_terminoffen2018` = '*ja*'
    WHERE NOT `jr_land` = '*schweiz*'
    AND `jr_datum2018` = '0000-00-00 00:00:00' 
    AND `jr_datum` = '2017-08-01 00:00:00'

EDIT: Okay das funktioniert dohc nicht ganz.
Bei meinem WHERE NOT Beispiel würde er dann alles nehmen was nicht schweiz und nicht das Datum 2017-08-01 hat. Ich möchte aber das nur die genommen werden sollen, die NICHT Schweiz sind aber schon das Datum 2017-08-01 haben.
Also WHERE NOT und WHERE in einem Befehl...
Leider bekomme ich das nicht hin
 
Zuletzt bearbeitet:
Das "NOT" bezieht sich ausschließlich auf den logischen Wert dahinter und nicht auf das "WHERE".

Ich kann deshalb auch keinen Fehler in dem letzten Beispiel erkennen, das sollte genau machen was Du beschrieben hast.

Du kannst es aber auch anders schreiben - mit ungleich (!=) an Stelle von gleich (=), das funktioniert nur nicht mit dem "IN" aus meinem Beispiel.

Code:
WHERE `jr_land` != '*schweiz*'
    AND `jr_datum2018` = '0000-00-00 00:00:00' 
    AND `jr_datum` = '2017-08-01 00:00:00'
 
Zuletzt bearbeitet:
Danke Andreas,
Von der Ungleich-Funktion (!=) wusste ich nichts. Das macht natürlich die Sache erheblich einfacher.

Hier ist mein fertiger Code:


Code:
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = `jr_datum` + INTERVAL 364 DAY,
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND DATE(`jr_datum`) NOT IN ('2017-01-01', '2017-01-06', '2017-04-15', '2017-04-16', '2017-04-17', '2017-05-01', '2017-05-25', '2017-06-04', '2017-06-05', '2017-06-15', '2017-08-01', '2017-08-15', '2017-10-03', '2017-10-26', '2017-11-01', '2017-12-08', '2017-12-24', '2017-12-25', '2017-12-26', '2017-12-31');

/* Ausnahme Neujahr (immer 1.1) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-01-01 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-01-01 00:00:00';

/* Ausnahme heilige Dreikönige (immer 6.1) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-01-06 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-01-06 00:00:00';

/* Ausnahme Ostersamstag (wechselt jedes Jahr) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-03-31 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-04-15 00:00:00';

/* Ausnahme Ostersonntag (wechselt jedes Jahr) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-04-01 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-04-16 00:00:00';

/* Ausnahme Ostermontag (wechselt jedes Jahr) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-04-02 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-04-17 00:00:00';

/* Ausnahme Staatsfeiertag / Tag der Arbeit (immer 1.5) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-05-01 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-05-01 00:00:00';

/* Ausnahme Christi Himmelfahrt / Auffahrt (wechselt jedes Jahr) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-05-10 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-05-25 00:00:00';

/* Ausnahme Pfingstsonntag (wechselt jedes Jahr) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-05-20 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-06-04 00:00:00';

/* Ausnahme Pfingstmontag (wechselt jedes Jahr) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-05-21 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-06-05 00:00:00';

/* Ausnahme Fronleichnam (wechselt jedes Jahr) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-05-31 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-06-15 00:00:00';

/* Ausnahme Schweizer Nationalfeiertag (immer 1.8 - NUR SCHWEIZ) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-08-01 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-08-01 00:00:00'
    AND `jr_land` = '*schweiz*';

/* Ausnahme Schweizer Nationalfeiertag (immer 1.8 - ALLE ANDEREN LÄNDER) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = `jr_datum` + INTERVAL 364 DAY,
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_land` != '*schweiz*'
    AND `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-08-01 00:00:00';
   
/* Ausnahme Mariä Himmelfahrt (immer 15.8) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-08-15 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-08-15 00:00:00';

/* Ausnahme Tag der deutschen Einheit (immer 3.10 - NUR DEUTSCHLAND) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-10-03 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-10-03 00:00:00'
    AND `jr_land` = '*deutschland*';

/* Ausnahme Tag der deutschen Einheit (immer 3.10 - ALLE ANDEREN LÄNDER) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = `jr_datum` + INTERVAL 364 DAY,
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_land` != '*deutschland*'
    AND `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-10-03 00:00:00';

/* Ausnahme Nationalfeiertag (immer 26.10 - NUR ÖSTERREICH) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-10-26 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-10-26 00:00:00'
    AND `jr_land` = '*österreich*';

/* Ausnahme Nationalfeiertag (immer 26.10 - ALLE ANDEREN LÄNDER) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = `jr_datum` + INTERVAL 364 DAY,
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_land` != '*österreich*'
    AND `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-10-26 00:00:00';

/* Ausnahme Mariä Himmelfahrt (immer 1.11) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-11-01 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-11-01 00:00:00';

/* Ausnahme Mariä Empfängnis (immer 8.12 - NUR ÖSTERREICH, SCHWEIZ) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-12-08 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-12-08 00:00:00'
    AND `jr_land` = '*österreich*' OR '*schweiz*';

/* Ausnahme Maria Empfängnis (immer 8.12 - ALLE ANDEREN LÄNDER) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = `jr_datum` + INTERVAL 364 DAY,
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_land` != '*österreich*'
    AND `jr_land` !='*schweiz*'
    AND `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-12-08 00:00:00';

/* Ausnahme Weihnachten (immer 24.12) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-12-24 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-12-24 00:00:00';

/* Ausnahme Christtag (immer 25.12) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-12-25 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-12-25 00:00:00';

/* Ausnahme Stephanitag (immer 26.12) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-12-26 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-12-26 00:00:00';

/* Ausnahme Silvester (immer 31.12) */
    UPDATE `xx_jreviews_content`
    SET `jr_datum2018` = '2018-12-31 00:00:00',
        `jr_terminoffen2018` = '*ja*'
    WHERE `jr_datum2018` = '0000-00-00 00:00:00'
    AND `jr_datum` = '2017-12-31 00:00:00';

[/code]
 
Zuletzt bearbeitet:
Hallo,
ich habe wieder eine dazu passende Frage.

Ich möchte den Saisonbeginn von vielen Einträgen auf + 1 Jahr (minus 1 Tag setzen, damit gleicher Wochentag). Aber nur dann wenn noch der alte Termin eingetragen ist

UPDATE `xx_jreviews_content`
SET `jr_saisonbeginn` = `jr_saisonbeginn` + INTERVAL 364 DAY,
WHERE `jr_saisonbeginn` = '??????'

da mit dem Fragezeichen bin ich noch unsicher.
hier sollte folgendes rein.
wenn jr_saisonbeginn mit "2017" beginnt, dann soll der SET-Befehl angewendet werden.
wenn jr_saisonbeginn aber mit "2018" beginnt, dann soll der befehl nicht angewendet werden.

Deswegen, weil ich bei einigen schon die aktuellen daten habe und bei anderen nicht.

Beispiel:
Ein Datensatz mit "2018-12-15 00:00:00" soll exakt so bleiben
Ein Datensatz mit "2017-12-15 00:00:00" sollte in diesem Fall in "2018-12-14 00:00:00" korrigiert werden.

Könnt ihr mir da helfen?
 
Wie wäre es einfach mit:
SQL:
BEGIN TRANSACTION

UPDATE `xx_jreviews_content`
SET `jr_saisonbeginn` = `jr_saisonbeginn` + INTERVAL 364 DAY,
WHERE `jr_saisonbeginn` >= '2017-01-01 00:00:00' AND `jr_saisonbeginn` < '2018-01-01 00:00:00'

ROLLBACK TRANSACTION
--COMMIT TRANSACTION

Annahme: jr_saisonbeginn ist eine Spalte vom Typ Datum.

Damit aktualisierst du nur die Termine aus 2017. Mit einer Transaktion könntest du natürlich vorher testen. Die committest du dann sobald das Ergebnis zufriedenstellend ist. Dafür das ROLLBACK durch COMMIT ersetzen.
 
Ocram1992 schrieb:
Wie wäre es einfach mit:
SQL:
BEGIN TRANSACTION

UPDATE `xx_jreviews_content`
SET `jr_saisonbeginn` = `jr_saisonbeginn` + INTERVAL 364 DAY,
WHERE `jr_saisonbeginn` >= '2017-01-01 00:00:00' AND `jr_saisonbeginn` < '2018-01-01 00:00:00'

ROLLBACK TRANSACTION
--COMMIT TRANSACTION

Annahme: jr_saisonbeginn ist eine Spalte vom Typ Datum.

Damit aktualisierst du nur die Termine aus 2017. Mit einer Transaktion könntest du natürlich vorher testen. Die committest du dann sobald das Ergebnis zufriedenstellend ist. Dafür das ROLLBACK durch COMMIT ersetzen.
danke bruda, genauso so soll es funktionieren. Du hast mehr sehr geholfen, bro
 
Zurück
Oben