目前我的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的正确答案。
由于
答案 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)
)
我在一段时间之前回答了类似的答案。
start < end
(5-9):值必须介于开始和结束之间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))
编辑:将第二个开始/结束列添加到派生表中以处理班次的第二部分。
中的示例答案 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)))