0

这可能有一个简单的解决方案,但我现在无法理解它。

我的桌子看起来像这样

|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)')

4

1 回答 1

0

从你所说的你需要

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)

排除班次 id 为 6 的星期五,您的排除 id 不为 6 的星期五。

于 2012-07-11T14:31:16.567 回答