SQL SELECT逻辑

时间:2014-03-04 13:34:04

标签: mysql sql

我一直在思考这个问题时遇到了一些麻烦。我似乎无法定义一个足够准确的SELECT查询来给我想要的结果。

我将换档模式存储在表格中。这些转换模式对它们何时可以开始和结束没有任何限制(除了它们不能在每台机器上相互重叠)

这是表格的结构(5行示例数据) Table

我必须选择的唯一信息是:

  • 当前时间(例如01:45)
  • 当前工作日(例如星期二)

问题是班次与00:00重叠。所以我的问题是:

如何根据当前时间和工作日选择当前班次?

Here is an SQL Fiddle of the scenario

谢谢!

3 个答案:

答案 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'