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”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'
你的问题是正确的。但错误的是您的数据类型 考虑到它们是字符串,而不是日期时间值,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'))