在SQL查询中获取Shift值的难度

时间:2015-11-18 19:57:39

标签: sql sql-server

目前我的SHIFT表结构如下:

ID   Name       Start    End 
1    Shift1     06:00    14:00
2    Shift2     14:00    22:00
3    Shift3     22:00    06:00

现在我以小时形式将参数传递给此查询,如11或15或22或03

对于那个参数,我想得到的结果是传递的小时将在哪个班次。

所以如果我通过11,它会给我Shift1。如果我通过23,它应该给我Shift3。

我写的查询对于07到21之间的任何值都可以正常工作,它给出了空白值,原因很明显。

select * from MII_SHIFT
where '[Param.1]' >= left(START,2) and '[Param.1]' <  left(END,2) 

任何人都可以帮助我如何更改查询,以便我可以得到22,23,00,01,02,03,04,05的正确答案。

由于

4 个答案:

答案 0 :(得分:2)

SELECT *
FROM shift
WHERE 
     (    left(START,2) > left(END,2)
     AND  ('[Param.1]' >= left(START,2) OR '[Param.1]' <  left(END,2))
     )
OR   (    left(START,2) < left(END,2)
     AND  '[Param.1]' >= left(START,2) AND '[Param.1]' <  left(END,2) 
     )

enter image description here

我在一段时间之前回答了类似的答案。

  • 短裤start < end(5-9):值必须介于开始和结束之间
  • Jacket start > end(10-4):值为< start> end

答案 1 :(得分:1)

最简单的方法是将时间转换为日期,如果结束日期早于开始,则添加一天。您也可以使用time数据类型作为输入,而不仅仅是小时,但现在这是int:

的示例
declare @hour int, @date datetime

set @hour = 3

set @date = convert(datetime, convert(varchar(2), @hour) + ':00', 108) 

select Name
from (
  select Name, 
    [Start] as Start1, 
    case when [End] < [Start] then dateadd(day, 1, [End]) else [End] End as End1,
    case when [End] < [Start] then dateadd(day, -1, [Start]) else [Start] End as Start2, 
    [End] as End2   
  from (
    select Name, convert(datetime, [Start], 108) as [Start], convert(datetime, [End], 108) as [End]
    from Table1
  ) X
) Y
where ((Start1 <= @date and @date < End1) or (Start2 <= @date and @date < End2))

编辑:将第二个开始/结束列添加到派生表中以处理班次的第二部分。

SQL Fiddle

中的示例

答案 2 :(得分:1)

假设值存储为字符串,那么这很容易:

select s.*
from shifts s
where (start < end and right('00' + @param1, 2) >= start and right('00' + @param1, 2) < end) or
      (start > end and (right('00' + @param1, 2) >= start or right('00' + @param1, 2) < end))

这假定@param1是一个字符串。 right()用于左键填充字符串为零。如果这已经是真的,那么代码会更简单。

编辑:

使用填充,这简化为:

select s.*
from shifts s
where (start < end and @param1 >= start and @param1< end) or
      (start > end and (@param1 >= start or @param1 < end))

答案 3 :(得分:0)

谢谢大家。有了你所有参考文献中的肝,我就能够建立一个给我适当结果的查询。

查询是愚蠢的:

SELECT Name FROM  SHIFT WHERE 

(LEFT(START,2) < LEFT(END,2) AND '[Param.1]' >= LEFT(START,2) AND '[Param.1]' < LEFT(END,2)) 

OR

(LEFT(START,2) > LEFT(END,2) AND ('[Param.1]' >= LEFT(START,2) OR '[Param.1]' < LEFT(END,2)))