Sql查询获取值范围

时间:2009-04-03 04:51:33

标签: sql-server-2005

我有一个名为TimeList的表

  SlotID           SlotStartTime    SlotEndTime
  (int identity)   (varchar(10))    (varchar(10))
    1              8:00AM           8:15AM
    2              8:15AM           8:30AM 
    3              8:30AM           8:45AM
    4              8:45AM           9:00AM
    5              9:00AM           9:15AM
    6              9:15AM           9:30AM
    7              9:30AM           9:45AM  
    8              9:45AM           10:00AM

如果我正在传递SlotStartTime和SlotEndTime,我想在两者之间得到时间。 我使用以下查询来获取b / w slotStarttime 8:00 am amd slotEndTime 9:00 AM的时隙

select * from TimeList1 where StartTime >='8:00AM' and EndTime <= '9:00AM'

结果如下:

SlotID     SlotStartTime    SlotEndTime
  1          8:00AM            8:15AM
  2          8:15AM            8:30AM 
  3          8:30AM            8:45AM
  8          9:45AM            10:00AM

我希望从上午8:00开始获得slotstarttime,并且结束时间为上午9:00的slotendtime意味着 预期结果是:

SlotID     SlotStartTime    SlotEndTime
  1          8:00AM           8:15AM
  2          8:15AM           8:30AM 
  3          8:30AM           8:45AM
  4          8:45AM           9:00AM

我必须在查询中进行哪些更改才能获得上述结果?

5 个答案:

答案 0 :(得分:0)

select * 
from TimeList1 
where StartTime >= '8:00AM' 
  and EndTime   <= '9:00AM'

小于或等于,不大于或等于。

尽管如此,当你的列是varchar类型时,这并不像你期望的那样。使用时间或日期时间类型。

  

前两段并没有解释我所能看到的事情。最后一段包含对问题的脆弱解释。 - 乔纳森莱弗勒

在原始帖子中,在你编辑它之前,OP有他的选择语句,

select * 
from TimeList1 
where StartTime >= '8:00AM' 
  and EndTime   >= '9:00AM'

我对此作出了回应。

我的回答可能是“脆弱的”,但我想解决这个明显的问题并让这个人继续前进。

答案 1 :(得分:0)

当您使用varchars(或大多数语言中的字符串)时,您会发现"10:00" < "9:00"只是因为字符排序规则(因为"1" < "9")。

您应该在日期和时间列中存储日期和时间值。如果您必须使用varchars,您需要将它们转换为固定大小的24小时格式才能正确执行(例如,“01:30”,“12:15”,“18: 25" )。

但我的建议是将它们存储为正确的DB日期和时间值。您的查询将更容易,更快。

如果我理解您的数据存储(每季度一个条目),以下解决方案可能会为您提供所需的内容,但我的专业意见是修复列类型,因为这样可以在您的select语句中提供更具表现力的条件:

select * from TimeList1
where left(StartTime,1) = '8'
and   right(StartTime,2) = 'AM'

答案 2 :(得分:0)

您的查询是正确的。但这是你的数据类型错误。

上午10:00确实在上午9:00之前考虑它们是字符串,而不是日期时间值。

因此,如果您现在无法更改数据类型,那么最好的运气是尝试此查询:

Select * from TimeList1
    where StartTime >= Cast('8:00AM' as datetime)
      and EndTime   <= Cast('9:00AM' as datetime)
//make sure StartTime and EndTime is type of datetime

答案 3 :(得分:0)

正如已经指出的那样,部分问题在于您使用字符串来表示时间。问题的另一部分是AM / PM表示法完全可以用于计算目的。请记住,顺序是:

12:00AM
12:15AM
12:30AM
12:45AM
 1:00AM
 1:15AM
 ...
 9:45AM
10:00AM
10:15AM
 ...
11:30AM
11:45AM
12:00PM
12:15PM
12:30PM
12:45PM
 1:00PM
 1:15PM
 ...

24小时制有许多优点。如果您使用:

00:00
00:15
00:30
00:45
01:00
01:15
 ...
09:45
10:00
10:15
 ...
11:30
11:45
12:00
12:15
12:30
12:45
13:00
13:15
 ...

(对于同一组数字),您的VARCHAR字符串可以制作成CHAR(5)并按时间顺序自动排序。你仍然需要正确地对你的查询进行短语,包括小于10:00的前导零,但这些值会正确排序并正确比较。

某些DBMS提供对子时间的支持。在IBM Informix Dynamic Server中,您可以使用DATETIME HOUR TO MINUTE作为列的类型。这会让你恢复掉掉前导零的灵活性。

另见Convert 12-hour date/time to 24-hour date/time

答案 4 :(得分:0)

试试这个:

SELECT * 
FROM TimeList1 
WHERE (CONVERT(datetime, CONVERT(varchar, GETDATE(), 103) + ' ' + StartTime) >= 
       CONVERT(datetime, CONVERT(varchar, GETDATE(), 103) + ' ' + '8:00AM')) 
    AND 
     (CONVERT(datetime, CONVERT(varchar, GETDATE(), 103) + ' ' + EndTime) <= 
      CONVERT(datetime, CONVERT(varchar, GETDATE(), 103) + ' ' + '9:00AM'))