我一直在思考这个问题时遇到了一些麻烦。我似乎无法定义一个足够准确的SELECT查询来给我想要的结果。
我将换档模式存储在表格中。这些转换模式对它们何时可以开始和结束没有任何限制(除了它们不能在每台机器上相互重叠)
这是表格的结构(5行示例数据)
我必须选择的唯一信息是:
问题是班次与00:00重叠。所以我的问题是:
如何根据当前时间和工作日选择当前班次?
Here is an SQL Fiddle of the scenario
谢谢!
答案 0 :(得分:2)
你可以用简单的逻辑来做到这一点。如果是StartTime < EndTime
,那么您要测试两个值之间的时间。如果是Startime > EndTime
,那么您要测试两个值之间不的时间。所以这解决了时间问题:
SELECT *
FROM webreportshiftsetup
WHERE (StartTime < EndTime and time(now()) between StartTime and EndTime or
StartTime > EndTime and time(now()) not between StartTime and EndTime
) and
dayname(now()) in (StartWeekDay, EndWeekDay)
您在工作日遇到类似问题。但你的问题是关于时间而不是工作日。 (这应该是另一个问题。)
答案 1 :(得分:1)
如果您的班次是一天(即您只需要选择当天),您可以执行类似
的操作SELECT * FROM shifts
WHERE startWeekDay = DATE_FORMAT(CURDATE(),'%W') AND NOW() BETWEEN startTime AND endTime
否则,如果您的班次从星期一开始并在星期三结束,而今天是星期二,那么您将无法通过查询找到今天的班次。为此你应该存储天数:1-星期一,2-星期五,......
答案 2 :(得分:0)
我建议您更改架构。一种选择是使用datetime
类型作为开始/结束,而不是将varchar用于所有内容。
然后你可以查询它:
SELECT *
FROM webreportshiftsetup
WHERE NOW() BETWEEN StartDateTime AND EndDateTime
等等。
如果您需要将此作为特定日期不起作用的重复内容,则可以创建StartDay / EndDay列tinyint
并为其指定值1-7,其中最小的数字为一周的第一天和代表一周最后一天的最大数字。 StartTime / EndTime将为date
类型。查询看起来像:
SELECT *
FROM webreportshiftsetup
WHERE StartDay >=2 AND EndDay <=4 AND StartTime >= '2:00' AND EndTime <= '13:00'