Sql server 2005 Sql查询以获取值的范围

Sql server 2005 Sql查询以获取值的范围,sql-server-2005,Sql Server 2005,我有一张叫做“时间列表”的桌子 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

我有一张叫做“时间列表”的桌子

  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:00AM和slotEndTime 9:00AM中的时隙

select * from TimeList1 where StartTime >='8:00AM' and EndTime <= '9:00AM'
我想让slotstarttime从上午8:00开始,slotendtime结束于上午9:00意味着 预期结果是:

SlotID     SlotStartTime    SlotEndTime
  1          8:00AM           8:15AM
  2          8:15AM           8:30AM 
  3          8:30AM           8:45AM
  4          8:45AM           9:00AM
要获得上述结果,我必须在查询中进行哪些更改

select * 
from TimeList1 
where StartTime >= '8:00AM' 
  and EndTime   <= '9:00AM'
我对此作出了回应


我的回答可能是“站不住脚”,但我想解决这个明显的问题,让他继续前进。

当你使用varchars(或大多数语言中的字符串)时,你会发现
“10:00”
仅仅是因为字符排序规则(因为
“1”

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

但我的建议是将它们存储为适当的DB日期和时间值。您的查询将更简单、更快

如果我了解您的数据存储(每四分之一小时一个条目),以下解决方案可能会满足您的需要,但我的专业意见是修复列类型,因为这将允许在select语句中使用更具表现力的条件:

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

你的问题是正确的。但错误的是您的数据类型

考虑到它们是字符串,而不是日期时间值,10:00AM实际上早于9:00AM

因此,如果您现在无法更改数据类型,最好尝试以下查询:

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
从时间列表1中选择*
其中StartTime>=Cast('8:00AM'作为日期时间)

而EndTime问题的一部分,正如已经注意到的,是使用字符串来表示时间。问题的另一部分是,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时的前导零,但这些值将正确排序和比较

一些数据库管理系统提供对时间子集的支持。在IBMInformixDynamicServer中,可以使用DATETIME小时到分钟作为列的类型。这将使您恢复删除前导零的灵活性

另请参见。

尝试以下操作:

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'))
选择*
来自时间列表1
其中(CONVERT(datetime,CONVERT(varchar,GETDATE(),103)+''+StartTime)>=
CONVERT(datetime,CONVERT(varchar,GETDATE(),103)+''+'8:00AM'))
及

(CONVERT(datetime,CONVERT(varchar,GETDATE(),103)+''+EndTime)就我所见,前两段没有解释一件事。最后一段对这个问题的解释站不住脚。顺序比你想象的更糟——我不认为只有一位数小时的时间有领先的空间。是的——提问者的数据格式是完全不可管理的,没有转换时间的专门功能将字符串转换为某种正常的表示形式(最有可能是午夜后的几分钟)。
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
 ...
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'))