搜索

首页  >  问答  >  正文

重写的标题为:Retrieving records in increments of 30 days

我有以下查询来获取需要每月提醒一次(如果尚未完成)的约会。 我想获取从当前日期起过去 30、60、90、120 等的记录。

SELECT
    a.*
FROM
    appointments a
WHERE
    DATEDIFF(CURDATE(), a.appointment_date) % 30 = 0

是否有另一种方法不使用 DATEDIFF 来实现此目的?我想提高此查询的性能。

P粉633309801P粉633309801291 天前404

全部回复(2)我来回复

  • P粉860370921

    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;

    回复
    0
  • P粉186904731

    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

    有时,仅针对直接问题提供答案并不能满足正确的需求。希望我能更准确地满足预期的最终结果需求。同样,上述内容意味着加入患者表以进行后续呼叫以安排预约。

    回复
    0
  • 取消回复