我有一个根据时间回退数据的查询。
在数据库中,我有每个"频道"使用StartTime和EndTime,在军事上作为varchar完成。所以,上午12:00 am = 0000,凌晨3:00 = 0300,下午4:00 = 1600,晚上10:00 = 2200等。
我在下面粘贴的查询只要StartTime是"之前" EndTime,因为它使用一些基本小于大于比较。因此,如果一个频道的开始时间是凌晨3点,结束时间是下午4点,那么我将在凌晨5点通过,0300< 0500< 1600,所以它显示。我遇到逻辑问题的地方是夜晚的问题,其中包括"溢出"进入第二天。因此,如果频道是从晚上11点到凌晨4点,那么2300> 0400,所以它不会显示我是否通过了午夜或0000的时间。
我只需要一些帮助来调整处理这种类型的翻转场景的逻辑。以下场景假定我传入的时间是上午12:30。假设我在数据库集中有一个频道,其开始时间为晚上10点(2200),结束时间为凌晨4点(0400)。
declare @TimeOfDay varchar(200)
set @TimeOfDay = '0030'
select
ChannelID, c.ChannelName
from Channels
where
CONVERT(INT,FeaturedStartTime) < CONVERT(INT,@TimeOfDay)
and CONVERT(INT,FeaturedEndTime) > CONVERT(INT,@TimeOfDay)
答案 0 :(得分:0)
尝试将您的条件更改为
WHERE
(CONVERT(INT,FeaturedStartTime) < CONVERT(INT,@TimeOfDay)
AND CONVERT(INT,FeaturedEndTime) > CONVERT(INT,@TimeOfDay)
)
OR
(CONVERT(INT,FeaturedStartTime) > CONVERT(INT,FeaturedEndTime)
AND (CONVERT(INT,@TimeOfDay) > CONVERT(INT,FeaturedStartTime)
OR CONVERT(INT,@TimeOfDay) < CONVERT(INT,FeaturedEndTime)
)
)
我们基本上添加了另一个案例,其中StartTime
大于EndTime
,但searched time
需要外此区间(即大于StartTime
或小于EndTime
)。
注意:注意括号!
答案 1 :(得分:0)
只需几个小时进行比较,如果确定没有频道可以持续<强> 24小时或更长时间,您将只能获得可靠的结果。
例如,如果@TimeOfDay ='0500',则条目中不包含条目:{1600的一天和1800的第二天}的行将不包含在结果中。因此,假设您有像FeaturedStart Date 和FeaturedEnd Date 这样的字段(例如'20160916'),那么:
如果您需要包含结果(@TimeOfDay = 1600或2030仍然在1600-2030期间),那么:
WHERE
(
FeaturedEndTime >= @TimeOfDay
AND
FeaturedStartTime <= @TimeOfDay
)
OR
(
FeaturedStartTime > FeaturedEndTime
AND
(
FeaturedEndTime >= @TimeOfDay
OR
FeaturedStartTime <= @TimeOfDay
)
)
OR
(
FeaturedStartTime <= FeaturedEndTime
AND
FeaturedStartDate < FeaturedEndDate
)
如果您需要非独占结果,请执行以下操作:
WHERE
(
FeaturedEndTime > @TimeOfDay
AND
FeaturedStartTime < @TimeOfDay
)
OR
(
FeaturedStartTime > FeaturedEndTime
AND
(
FeaturedEndTime > @TimeOfDay
OR
FeaturedStartTime < @TimeOfDay
)
)
OR
(
FeaturedStartDate < FeaturedEndDate
AND
(
FeaturedStartTime < FeaturedEndTime
OR
(/*for consequence in being noninclusive*/
FeaturedStartTime = FeaturedEndTime
AND
FeaturedStartTime <> @TimeOfDay
)
)
请注意,如果您使用非独占方法,那么您的所有查询都不会返回在同一分钟内开始和结束的频道,例如@TimeOfDay = 1302将无法播放1302-1302(例如频道开始于13:02:00结束13:02:59)