1

嗨,在我的表中,我有 3 列(名称 - 从 - 到)
和数据类型 time(7) 我从 08:00:00 到 15:00:00
插入 3 个 shift shift1从 15:00:00 到 22:00 :00 shift3 从 22:00:00 到 08:00:00 我有创建 SP 来检查什么是 shift 现在这是 SP



create PROC SelectShift

AS
DECLARE @TimeNow TIME  =  substring(convert(varchar(20), GetDate(), 9), 13, 5) 
+ ' ' + substring(convert(varchar(30), GetDate(), 9), 25, 2)

SELECT s.Shift_Name, s.Id FROM Schedule s
WHERE @TimeNow BETWEEN s.ShiftTime_From AND s.ShiftTime_To


它在班次 1 和 2 中工作正常,
但在班次 3 中它选择 null(现在时间 22:55:00.0000000)
我之前不使用 sql 时间所以你能帮忙吗

4

2 回答 2

1

我的第一个想法是将每个间隔从 00:00:00 开始考虑,并将当前时间移动相同的量,但不支持减去时间。所以我最终使用了两个案例。

这可能是一个表值函数而不是 proc,这可能会使它更容易编写:

Create Proc ShiftForTime @time time as
Select 
    *
From
    schedule
Where (
        ShiftTime_From < ShiftTime_To and
        @time >= ShiftTime_From and
        @time < ShiftTime_To
    ) or (
        ShiftTime_From > ShiftTime_To and (
            @time >= ShiftTime_From or
            @time < ShiftTime_To
        )
    )
Go
Create Proc SelectShift As
Declare @now time = getdate()
Exec ShiftForTime @now

这是一个使用表值函数的示例,其中包含许多不同的测试:

Example SQLFiddle

只是为了求知欲,我的第一个想法可以发挥作用,尽管它可能效率较低

Create Proc ShiftForTime2 @time time  as
Select 
    *
From
    schedule
Where
    dateadd(second, datediff(second, ShiftTime_From, 0), @time) 
      < dateadd(second, datediff(second, ShiftTime_From, 0), ShiftTime_To)
于 2013-10-28T22:00:54.780 回答
1

您得到的结果是正确的,因为时间变量无法确定班次的开始是前一天(即 00:00:00 之前)还是之后。

您可以使用以下方法解决此问题,但这是非常难看的编码。

DECLARE @TimeNow TIME  = '22:55:00.0000000'

-- substring(convert(varchar(20), GetDate(), 9), 13, 5) 
--+ ' ' + substring(convert(varchar(30), GetDate(), 9), 25, 2)


SELECT s.Shift_Name FROM #Schedule s
WHERE @TimeNow BETWEEN s.ShiftTime_From AND (CASE WHEN s.ShiftTime_From > s.ShiftTime_To THEN '23:59:59' ELSE s.ShiftTime_To END)
于 2013-10-28T22:03:43.057 回答