按日期获取记录是30天的倍数



我有以下查询来获取需要每月提醒一次的约会,如果这些约会还没有完成我想获得30、60、90、120等的记录。。。从当前日期算过去

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

有没有其他方法可以不使用DATEDIFF来实现这一点?我想提高这个查询的性能。

好的,让我们暂时把日期和日期差异放在一边。看着这个问题,这个人试图寻找过去的所有约会,而这些约会在未来不一定会有另一个。例如与医生";一个月后再来看看情况发生了什么变化;。这让我想到预约表中可能有一些患者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

有时,仅仅针对直接问题给出答案并不能得到正确的需求。希望我能达到预期的最终结果。同样,上述内容意味着加入患者表以进行后续呼叫,从而安排预约。

您可以使用以下查询来比较任命月份的日期和今天的日期
我们还测试我们是否是本月的最后一天,以便在月底获得到期的任命。例如,如果我们是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;

你只想在未来30天内预约吗?它们是否存储为DATE?还是DATETIME?好吧,这在任何一种情况下都有效:

SELECT ...
WHERE appt_date >= CURDATE() + INTERVAL 30 DAY
AND appt_date  < CURDATE() + INTERVAL 31 DAY

如果您有INDEX(appt_date)(或任何以appt_date开头的索引),那么查询将是有效的。

像CCD_ 6这样的东西不是";sargable";,并防止索引的使用。

如果你的目标是唠叨客户,我认为你的查询中没有任何内容可以防止一遍又一遍地唠叨每个人。这可能需要一个单独的";唠叨;表中,可以删除对nag感到满意的客户。那么性能就不会有问题,因为桌子会很小。

如果您主要关心的是加快此查询的速度,我们可以添加一个int列来比较天数并对其进行索引。然后添加触发器来计算Unix周期开始日期之间的datediff模数:1970年1月1日(或您喜欢的任何其他日期),并将结果存储在此列中
这将占用少量存储空间,并降低插入和更新操作的速度。当我们一次添加或修改一个约会时,这是不可通知的,我怀疑这是一般情况
当我们查询表时,我们会计算今天的日期值,这将花费很少的时间,因为它只会完成一次,并将其与日期列进行比较,因为它是索引的,并且不涉及任何计算,所以会非常快
最后,我们运行您的当前查询,并使用explain查看它,以了解即使我们已经为列date_编制了索引,该索引也不能用于此查询。

CREATE TABLE appointments (
id INT PRIMARY KEY NOT NULL AUTO_INCREMENT, 
date_ date,
days int 
);
CREATE INDEX ix_apps_days ON appointments (days);
✓✓
<blockquote\
CREATE PROCEDURE apps_day()
BEGIN
UPDATE appointments SET days = day(date_);
END
><block✓>
CREATE TRIGGER t_apps_insert BEFORE INSERT ON appointments
FOR EACH ROW
BEGIN
SET NEW.days = DATEDIFF(NEW.date_, '1970-01-01') % 30 ;
END;
CREATE TRIGGER t_apps_update BEFORE UPDATE ON appointments
FOR EACH ROW
BEGIN
SET NEW.days = DATEDIFF(NEW.date_, '1970-01-01') % 30 ;
END;
insert into appointments (date_) values ('2022-01-01'),('2022-01-01'),('2022-04-15'),(now());
update appointments set date_ = '2022-01-12' where id = 1;
select * from appointments
id|date_|天-:|:--------|---:2022-01-12|142022-01-01|32022-04-15|17年3月4 | 2022-04-22 | 24
select 
*
from appointments
where DATEDIFF(CURDATE() , '1970-01-01') % 30 = days;
id|date_|天-:|:--------|---:4 | 2022-04-22 | 24
explain
select  DATEDIFF(CURDATE() , '1970-01-01')
from appointments
where DATEDIFF(CURDATE() , '1970-01-01') = days;
id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra-:|:---------------|----------1|SIMPLE|appointments|null|ref|ix_apps_days|ix_app.days|5|const|1|1|100.00|使用索引
CREATE INDEX ix_apps_date_ ON appointments (date_);
SELECT
a.*
FROM
appointments a
WHERE
DATEDIFF(CURDATE(), a.date_) % 30 = 0
id|date_|天-:|:--------|---:4 | 2022-04-22 | 24
explain
SELECT
a.*
FROM
appointments a
WHERE
DATEDIFF(CURDATE(), a.date_) % 30 = 0
id|select_type|table|partitions|type|possible_keys|key|key_len|ref|rows|filtered|Extra-:|:---------------|----------1|SIMPLE|a|null|ALL |null|null|>null| 4|100.00|使用其中

db<gt;小提琴这里

最新更新