2017-02-02 5 views
1

Ich habe eine MySQL-Tabelle mit den folgenden Spalten:Wie man diese Zeitfensterabfrage macht?

id, month, day, remind_days_before 

Es ist für eine einfache Funktion wiederkehrenden Erinnerung. Der Benutzer kann zum Beispiel eingeben: "Ich habe eine sehr wichtige Sache am 5. April jedes Jahr, bitte daran erinnern, 15 Tage davor zu sein". In dieser Tabelle könnte es Zehntausende von Einträgen geben. Mit dieser Tabelle möchte ich jeden Morgen einen cron_job ausführen, der diese Erinnerungen in Form von E-Mails versendet. Das Problem ist, ich weiß nicht, wie man diese Art von SQL-Abfrage schreibt ... Ist es überhaupt möglich? Ich möchte nur die Zeilen abfragen, in denen der "Monat" und "Tag" als DATUM zwischen HEUTE und HEUTE + 31 Tage (das ist die maximale Anzahl für remind_days_before) ist.

ich mit diesem Moment bin versucht, aber der $ end_month ist mir das gleiche wie der $ today_month geben:

$today_month = date('m'); 

$end_month = date('m', strtotime('+31 days', $today_month)); 

Was passiert, wenn das 31 Tage DATUM im nächsten Jahr ist, oder wir haben Schaltjahr?!

Kann mir hier jemand helfen?

Vielen Dank.

+0

Nun, ich würde es einen Test geben und finden Sie heraus – RiggsFolly

+0

Sind Sie fragen nach einer Abfrage, die "15 Tage vor" aus dem Text extrahiert, den der Benutzer eingibt? Oder wie wird der Text des Benutzers in die tatsächliche Zeit übersetzt? –

+0

Ich verstehe deine Frage nicht ... was meinst du mit "Benutzertext"? – VORiAND

Antwort

1

Zu allererst Ihre Felder müssen ein No-mysql-Funktion sein. So Monat/Tag mit planning_month/planning_day, weil die month und day Worten sind die Funktionen von MySQL ersetzen, und Sie können Fehler aufweisen, wenn sie nicht

notiert Hier ist eine Arbeits Abfrage. Ich habe getestet und funktioniert super:

select * from MyTable 
/*CHECK CURRENT YEAR*/ 
where date(concat(year(now()), planning_month, planning_day)) = 
date(date_add(now(), interval remind_days_before DAY)) 
OR 
/*CHECK NEXT YEAR*/ 
date(concat(year(date_add(now(), INTERVAL 1 YEAR)), planning_month, planning_day)) = 
date(date_add(now(), interval remind_days_before DAY)) 

Live Example

Ihr es eine sehr nützliche Frage für mich ist zu

+0

Eine kleine Frage: Wie ändere ich die Abfrage, wenn meine planning_month und planning_day Spalte INT nicht VARCHAR ... sind? – VORiAND

+0

Ok, ich habe es selbst herausgefunden :) LPAD (planing_month, 2, '0') und für LPAD (planing_day, 2, '0') – VORiAND

0

Überprüfen Sie einfach für beide Jahre:

select * 
from your_table 
cross join (select year(now()) as current_year, year(now())+1 as next_year) vars 
where curdate() + interval remind_days_before day = concat(current_year,'-',month,'-',day) 
    or curdate() + interval remind_days_before day = concat( next_year,'-',month,'-',day)