我有一个表按初始小时到结束时间存储时间表,有些结构如
| 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
答案 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'