我在try 让这个发挥作用时遇到了很多麻烦.
我正在开发一个API,其中有活动(在模型中称为"会话"),这些活动具有两个时间相关属性,DID(活动本身的初始日期时间)和DURATION(活动本身的持续时间).
创建新活动时,我想判断将处理新活动的员工是否会与另一个活动重叠.
我使用Python(fastAPI)作为BE框架并使用mySQL数据库.目前我采取了以下方法:
def get_overlapping_staffSession(db: Session, session: schemas.SessionCreate) -> list[models.StaffSession]:
staff_ids = []
new_session_start = session.date
new_session_end = (session.date + timedelta(hours=session.duration))
for staff in session.staff:
staff_ids.append(staff.id)
overlapping_sessions = (
db.query(models.StaffSession)
.join(models.Session, models.StaffSession.id_session == models.Session.id)
.filter(
and_(
models.StaffSession.id_staff.in_(staff_ids),
models.Session.date <= new_session_end,
models.Session.date + (models.Session.duration * timedelta(hours=1)) >= new_session_start
)
)
).all()
return overlapping_sessions
这应该返回一个具有模型StaffSec的数组,该模型在新时间范围内并且拥有将在新活动中工作的员工.
值session.date属于类型datetime,模型会话中的列date属于类型datetime. 我在网上看到过不同的例子,使用它没有任何问题.
为了确保它有效,我try 在mySQL中实现相同的查询,以下内容使用与用于测试上面代码的值相同的值(id和时间范围).
SELECT
staffsession.*
FROM
staffsession
JOIN
session ON staffsession.id_session = session.id
WHERE
staffsession.id_staff IN (12)
AND session.date <= '2024-04-15T16:30:00+01:00'
AND session.date + INTERVAL session.duration SECOND >= '2024-04-15T13:30:00+01:00';
在执行此查询时,它在mySQL中工作得很好,在API中,它返回包含id为staff_ids的所有StaffMessage,但不按日期进行过滤.
我们非常欢迎您提供任何帮助,并感谢您抽出时间.