sql server查询中的时间条件逻辑

时间:2016-09-15 20:55:04

标签: sql sql-server tsql

我有一个根据时间回退数据的查询。

在数据库中,我有每个"频道"使用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)

2 个答案:

答案 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)