Heim > Fragen und Antworten > Hauptteil
Ich habe folgende Anfrage, um Termine zu erhalten, die einmal im Monat erinnert werden müssen (sofern sie noch nicht erledigt sind). Ich möchte Aufzeichnungen für die letzten 30, 60, 90, 120 usw. ab dem aktuellen Datum erhalten.
SELECT a.* FROM appointments a WHERE DATEDIFF(CURDATE(), a.appointment_date) % 30 = 0
Gibt es eine andere Möglichkeit, dies zu erreichen, ohne DATEDIFF zu verwenden? Ich möchte die Leistung dieser Abfrage verbessern.
P粉8603709212024-03-30 15:08:42
您可以使用以下查询将约会当月的日期与今天的日期进行比较。
我们还测试是否是该月的最后一天,以便在月底进行预约。例如,如果我们是 2 月 28 日(不是闰年),我们将接受该月的日期 >= 28
,即 29、30 和 31,否则这些日期将被错过。
此方法与您当前的系统存在相同的问题,即会错过周末的约会。
select a.* from appointements a, (select day(now()) today, case when day(now())= last_day(now()) then day(now()) else 99 end lastDay ) days where d = today or d >= lastDay;
P粉1869047312024-03-30 11:36:18
好吧,让我们暂时把日期和日期差异放在一边。从这个问题来看,此人正在尝试查找过去的所有约会,而将来不一定有另一个约会。例如与医生进行后续预约“一个月后回来看看情况发生了变化”。这让我想到预约表中可能有一些患者 ID。因此,这可能会将问题转向查看过去 30 天、60 天或 90 天前,看看未来是否有相应的约会安排。如果已经预约,患者不需要电话提醒即可进入办公室。
也就是说,我会以不同的方式开始,让所有在过去 90 天内进行过预约的患者,看看他们是否已经(或没有)在后续时间表中进行了后续预约-向上。这样,办公室人员就可以与所述患者联系以列入日历。
首先获取过去 90 天内任何给定患者的所有最大预约量。如果某人在 90 天前进行了预约,并在 59 天进行了后续行动,那么他们可能只关心最近的约会以确保有后续行动。
select a1.patient_id, max( a1.appointment_date ) MostRecentApnt from appointments a1 WHERE a1.appointment_date > date_sub( a1.appointment_date, interval 90 day ) group by a1.patient_id
现在,从这个固定的列表和开始日期开始,我们所关心的是,距当前还有多少天是最后一次约会。是 X 天吗?只需使用 datediff 并排序即可。您可以直观地看到有多少天。通过尝试将它们分成 30 天、60 天或 90 天的桶,只需知道距离上次约会有多少天,可能就像按降序排序一样简单,首先调用最旧的约会,而不是刚刚发生的约会。甚至可能在 20 天后切断通话清单,但仍然没有预约,并且已经接近预期的 30 天了。
SELECT p.LastName, p.FirstName, p.Phone, Last90.Patient_ID, Last90.MostRecentApnt, DATEDIFF(CURDATE(), Last90.appointment_date) LastAppointmentDays FROM ( select a1.patient_id, max( a1.appointment_date ) MostRecentApnt from appointments a1 WHERE a1.appointment_date > date_sub( a1.appointment_date, interval 90 day ) group by a1.patient_id ) Last90 -- Guessing you might want patient data to do phone calling JOIN Patients p on Last90.Patient_id = p.patient_id order by Last90.MostRecentApnt DESC, p.LastName, p.FirstName
有时,仅针对直接问题提供答案并不能满足正确的需求。希望我能更准确地满足预期的最终结果需求。同样,上述内容意味着加入患者表以进行后续呼叫以安排预约。