我有一个名为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
我必须在查询中进行哪些更改才能获得上述结果?
答案 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作为列的类型。这会让你恢复掉掉前导零的灵活性。
答案 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'))