SQL запрос для получения диапазона значений - PullRequest
0 голосов
/ 03 апреля 2009

У меня есть таблица с именем 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, я хочу получить промежуточное время. Я использовал следующий запрос, чтобы получить временные интервалы в ч / б slotStarttime 8:00 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, а время слотов, заканчивающееся в 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

Какое изменение я должен внести в свой запрос, чтобы получить результат, как указано выше?

Ответы [ 5 ]

0 голосов
/ 03 апреля 2009

Попробуйте это:

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'))
0 голосов
/ 03 апреля 2009

Часть проблемы, как было отмечено, заключается в том, что вы используете строки для представления времени. Другая часть вашей проблемы заключается в том, что запись 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, но значения будут правильно сортироваться и сравниваться.

Некоторые СУБД предоставляют поддержку подмножеств времени. В IBM Informix Dynamic Server вы можете использовать DATETIME HOUR TO MINUTE в качестве типа столбца. Это вернуло бы вам гибкость отбрасывания ведущих нулей.

См. Также Преобразование 12-часовой даты / времени в 24-часовую дату / время .

0 голосов
/ 03 апреля 2009

Когда вы используете varchars (или строки в большинстве языков), вы обнаружите, что "10:00" < "9:00" только из-за правил последовательности символов (начиная с "1" < "9").

Вы должны хранить значения даты и времени в столбцах даты и времени. Если вы должны использовать varchars, вам нужно преобразовать их в 24-часовой формат фиксированного размера, чтобы сделать это правильно (например, "01:30", "12:15", "18:25 «).

Но я советую хранить их как правильные значения даты и времени в БД. Ваши запросы будут проще и быстрее.

Следующее решение может дать вам то, что вы хотите, если я понимаю ваше хранилище данных (одна запись в квартал час), но мое профессиональное мнение состоит в том, чтобы исправить типы столбцов, поскольку это позволит использовать гораздо более выразительные условия в ваших утверждениях select:

select * from TimeList1
where left(StartTime,1) = '8'
and   right(StartTime,2) = 'AM'
0 голосов
/ 03 апреля 2009

Ваш запрос правильный. Но это ваши типы данных, которые являются неправильными.

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
0 голосов
/ 03 апреля 2009
select * 
from TimeList1 
where StartTime >= '8:00AM' 
  and EndTime   <= '9:00AM'

Меньше или равно, не больше или равно.

Хотя на самом деле это не работает так, как вы ожидаете, когда ваши столбцы имеют тип varchar. Используйте тип времени или даты.

Первые два абзаца, насколько я понимаю, ничего не объясняют. Последний абзац содержит хрупкое объяснение проблемы. - Джонатан Леффлер

В исходном сообщении, перед тем, как вы его отредактировали, ФП имел в качестве выражения выбора

select * 
from TimeList1 
where StartTime >= '8:00AM' 
  and EndTime   >= '9:00AM'

Я отвечал на это.

Мой ответ может быть "неубедительным", но я хотел решить очевидную проблему и заставить парня двигаться вперед.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...