在WHERE子句中为StartTime加2天的SQL查询修正需求
SQL查询修正方案
问题根源
原查询里的时间条件a.StartTime <= DATE_ADD(a.StartTime, INTERVAL 2 DAY)完全不起过滤作用——任何时间加上2天必然大于等于自身,所以这个条件永远为真,导致所有符合Confirmed条件的记录都会被返回,包括早于当前时间的旧数据。
修正后的查询语句
把时间条件改成基于当前时间的范围筛选,就能精准获取未来2天内的未确认预约:
SELECT a.StartTime, a.ClientId, a.ServiceId, a.id, a.WhoEdit, a.EndTime, a.Confirmed, a.WhoBooked, a.AppointmentNote, c.ClientFirstName, c.ClientLastName, c.ClientPhoneNumber, c.ClientAddress, c.ClientAddress2, c.ClientCity, c.ClientState, c.ClientZip, b.BusinessName, b.BusinessAddress, b.BusinessAddress2, b.BusinessCity, b.BusinessState, b.BusinessZip, b.BusinessOwnerName, b.BusinessOwnerEmail, b.BusinessOwnerPhoneNumber, s.ServiceName, s.ServicePrice, s.ServiceLength, s.ServiceNote FROM appointments a LEFT JOIN clients c ON a.ClientId = c.ClientId LEFT JOIN services s ON a.ServiceId = s.ServiceId LEFT JOIN business b ON a.BusinessId = b.BusinessId WHERE (a.Confirmed='false' OR a.confirmed='') AND a.StartTime >= NOW() AND a.StartTime <= DATE_ADD(NOW(), INTERVAL 2 DAY) ORDER BY b.BusinessName asc, a.StartTime desc
补充说明
- 若你的需求是筛选某个预约自身StartTime之后2天内的关联记录,逻辑会完全不同,但从描述来看,上述修正更匹配“获取未来2天内未确认预约”的需求。
- 如果
Confirmed字段是MySQL布尔类型(tinyint),建议把条件改成a.Confirmed = 0 OR a.Confirmed IS NULL,这样更符合数据库规范。
内容的提问来源于stack exchange,提问作者letsCode
相关产品推荐
相关产品推荐

