2009-04-03 4 views
0

У меня есть таблица под названием TimeListSql запрос, чтобы получить диапазон значений

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 драм slotEndTime 9:00 утра

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 

Я хочу, чтобы получить 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 

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

ответ

0

выберите * из TimeList1 где время_запуска> = '8:00 am' и EndTime < = '9:00 am'

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

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

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

В исходном сообщении, прежде чем редактировать его, OP имел в своем отборном заявлении, выберите * из TimeList1 где StartTime> = '8:00 am' и EndTime> = «9:00 AM '

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

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

+0

Первые два абзаца не объясняют вещи, насколько я могу видеть. В последнем абзаце содержится непростое объяснение проблемы. –

0

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

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

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

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

select * from TimeList1 
where left(StartTime,1) = '8' 
and right(StartTime,2) = 'AM' 
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 
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, но значения будут правильно сортироваться и правильно сравнивать.

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

См. Также Convert 12-hour date/time to 24-hour date/time.

+0

Порядок хуже, чем вы думаете - я не думаю, что времена с одноразрядным часом имеют ведущее место. – paxdiablo

+0

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

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')) 
Смежные вопросы