获得一系列值

时间:2009-03-31 13:39:30

标签: sql

我的表名为TimeList,在数据库中有2列SlotID(int identity)和SlotTime(varchar)就是这样。

SlotID   SlotTime
1        8:00AM-8:15AM
2        8:15AM-8:30AM
3        8:30AM-8:45AM
4        8:45AM-9AM
5        9AM-9:30AM

同样在下午6:45到7点半之间。

如果我将2个参数starttime和endtime传递为上午8:00,结束时间为9 AM,我想检索上面给定表中的前4行。任何人都可以帮助进行这样的存储过程。

3 个答案:

答案 0 :(得分:2)

是否可以重构表格如下:

SlotID   SlotStart   SlotEnd
----------------------------
1        8:00am      8:15am
2        8:15am      8:30am
...

如果将时间拆分为单独的列,则查询日期范围会更容易。查询看起来像这样:

@StartTime = '8:00am'
@EndTime = '9:00am'

select SlotID, SlotStart, SlotEnd
from Slots
where SlotStart >= @StartTime
and SlotEnd <= @EndTime

答案 1 :(得分:1)

您的数据未正确规范化,因此难以查询。字段应该只包含一个值,因此您应该在单独的字段中包含插槽的开始和结束时间:

SlotID   StartTime   EndTime
1        8:00AM      8:15AM
2        8:15AM      8:30AM
3        8:30AM      8:45AM
4        8:45AM      9:00AM
5        9:00AM      9:30AM

这也允许您使用字段的日期时间类型而不是文本数据类型,以便您可以轻松查询表:

select SlotId, StartTime, EndTime
from TimeList
where StartTime >= '8:00AM' and EndTime <= '9:00AM'

使用原始表格设计,您必须使用字符串操作来拆分字段中的值,并转换值以使其具有可比性。如果您在表中获得大量数据,这将成为性能的杀手,因为查询无法使用索引。

答案 2 :(得分:0)

问题是您的表未规范化。请在http://en.wikipedia.org/wiki/Database_normalization阅读,它可以大大提高您设计的系统的质量。

在您目前的情况下,请按照Andy的建议并分开SlotStart和SlotEnd。你的时间格式也不好。使用DateTime格式(或您的数据库提供的任何时间类型)或类似INT的数字类型来存储您的值(例如1800而不是下午6:00)。

然后你可以轻松使用

SELECT FROM TimeList WHERE SlotStart&gt; = ... AND SlotEnd&lt; = ...

并从表格中选择您喜欢的任何内容。