这可能有一个简单的解决方案,但我现在无法理解它。
我的桌子看起来像这样
|id|company_id|shift_type_id|user_id|date|create_at|updated_at|
我正在尝试列出属于特定用户的班次
SELECT * FROM shifts WHERE user_id = 1
然后在两个日期之间进行选择
SELECT * FROM shifts WHERE user_id = 1 and date BETWEEN '2012-07-09' and '2012-07-15'
排除周六和周日的所有班次
SELECT * FROM shifts WHERE user_id = 1 and date BETWEEN '2012-07-09' and '2012-07-15' and DAYNAME(date) != "Saturday" and DAYNAME(date) != "Sunday"
现在棘手的部分(对我来说),除此之外,我想排除周五的班次,在这种情况下为特定的 shift_type_id 6。我尝试这样做
SELECT * FROM shifts WHERE user_id = 1 and date BETWEEN '2012-07-09' and '2012-07-15' and DAYNAME(date) != "Saturday" and DAYNAME(date) != "Sunday" and (DAYNAME(date) != "Friday" and shift_type_id != 6)
这不起作用,我不太明白为什么,也不知道如何解决这个问题。我见过一些使用子查询并从主要结果中排除结果的解决方案,但我希望保持这个易于构建,以便我可以根据一组规则创建查询。
我在 rails3 项目中这样做,这就是它的样子
@user.work_hours.where('shifts.date between ? and ?', params[:start_date], params[:end_date]).where('DAYNAME(shifts.date) != "Sunday" and DAYNAME(shifts.date) != "Saturday" AND (DAYNAME(shifts.date) != "Friday" and shifts.shift_type_id != 6)')