我的表名为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行。任何人都可以帮助进行这样的存储过程。
答案 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; = ...
并从表格中选择您喜欢的任何内容。