晚上到早上两次之间的时间

时间:2016-08-25 06:05:57

标签: sql sql-server sql-server-2014

我有一个表按初始小时到结束时间存储时间表,有些结构如

| SCHEDULE_NAME | START_HOUR    | END_HOUR  |
| ------------- | ------------- | --------- |
| Morning Shift | 8:00          | 10:00     |
| Evening Shift | 13:00         | 17:00     |
| Night Shit    | 22:00         | 2:00      |

所以我必须验证一小时是否在开始和结束时间之间,我有一个表,其中所有小时数作为日期运行到函数中的此类验证

DECLARE @HOUR time = '9:00'
IF @HOUR BETWEEN @START_HOUR AND @END_HOUR
SELECT 'IS BETWEEN'
ELSE
SELECT 'IS NOT'

所以它在开始时间和结束时间是一个接一个(前两个案例)的时间表上工作正常,但在第三个案例,一个整夜的时间表,它失败,因为它认为结束时间低于小时,喜欢这种情况

DECLARE @HOUR time = '1:00'
-- Here START_HOUR is '22:00' AND END_HOUR is '2:00'
IF @HOUR BETWEEN @START_HOUR AND @END_HOUR
SELECT 'IS BETWEEN'
ELSE
SELECT 'IS NOT'

所以它返回 IS NOT 但是应该认为它在那个时间表之间

以防万一,没有时间表结束和开始时间可以相同,我使用的是SQL Server 2014

3 个答案:

答案 0 :(得分:1)

我看到了一个设计问题。正如@insilenzio在评论中所说,你应该将数据保存为 DateTime ,而不是时间

但是,您可以在进行比较之前将数据转换为日期时间,将end_date设置为比star_date更强,并确保检查的时间与end_date相同。 例如,举个例子:

Change hour to : '2016-01-02 09:00:00'
Change star_hour to: '2016-01-01 22:00:00'
Change end_hour to: '2016-01-02 02:00:00'

然后您的代码将毫无问题地工作。正如我所说,你确保@HOUR在@END_HOUR的同一天。如果不是,由于明显的原因,它将无法正常运行。

作为您可以在SQL Server 2012及更高版本中使用的示例代码:(可能您必须更正sintax,但它已接近工作)

DECLARE @HOUR Datetime = '2016-01-02 01:00:00'
IF @HOUR BETWEEN (cast('2016-01-01' as datetime) + cast(@START_HOUR as datetime)) AND (cast('2016-01-02' as datetime) + cast(@END_HOUR as datetime))
SELECT 'IS BETWEEN'
ELSE
SELECT 'IS NOT'

答案 1 :(得分:1)

如果我们坚持time类型,那么一种可能的方法是检查两个间隔 - 直到午夜和午夜。

DECLARE @HOUR time = '1:00';
DECLARE @START_HOUR time = '22:00';
DECLARE @END_HOUR time = '2:00';

IF @END_HOUR < @START_HOUR
BEGIN
    -- interval goes across the midnight
    IF @HOUR BETWEEN @START_HOUR AND '24:00'
        OR @HOUR BETWEEN '00:00' AND @END_HOUR
        SELECT 'IS BETWEEN'
    ELSE
        SELECT 'IS NOT'
    ;
END ELSE BEGIN
    -- interval is within the same day
    IF @HOUR BETWEEN @START_HOUR AND @END_HOUR
        SELECT 'IS BETWEEN'
    ELSE
        SELECT 'IS NOT'
    ;
END;

<强>结果

(No column name)
IS BETWEEN

如果我们可以使用datetime,那么我只需将24小时添加到@END_HOUR

答案 2 :(得分:0)

我建议你用几分钟转换时间,并在午夜时分进行计算:

DECLARE @HOUR time = '21:00'
DECLARE @START_HOUR time = '22:00'
DECLARE @END_HOUR time = '02:00'

DECLARE @START_MINUTES int = DATEPART(HOUR,@START_HOUR)*60 + DATEPART(MINUTE,@START_HOUR)
DECLARE @END_MINUTES int = DATEPART(HOUR,@END_HOUR)*60 + DATEPART(MINUTE,@END_HOUR)
DECLARE @MINUTES int = DATEPART(HOUR,@HOUR)*60 + DATEPART(MINUTE,@HOUR)

IF (@MINUTES < @START_MINUTES)
BEGIN
    SET @MINUTES = @MINUTES + 24 * 60
END

IF (@START_MINUTES < @END_MINUTES AND @MINUTES BETWEEN @START_MINUTES AND @END_MINUTES) OR (@START_MINUTES >= @END_MINUTES AND @MINUTES BETWEEN @START_MINUTES AND (@END_MINUTES + 24 * 60))
SELECT 'IS BETWEEN'
ELSE
SELECT 'IS NOT'