Диапазон времени - Sql - PullRequest
       7

Диапазон времени - Sql

3 голосов
/ 09 мая 2011

пожалуйста, помогите мне с моей проблемой.Итак, у меня есть таблица с именем 'RATES', которая содержит следующие столбцы:

id (int) 
rate (money) 
start_time (datetime) 
end_time(datetime)

пример данных:

1 150 8:00am 6:00pm 
2 200 6:00pm 4:00am
3 250 8:00am 4:00am (the next day)

Что мне нужно сделать, это выбрать все идентификаторытуда, где упало бы данное время.

например, данное время: 9:00 вечера, выходной сигнал должен быть 2,3

Проблема в том, что я получил этот интервал времени с 8:00 до 4:00 следующегодень, и я не знаю, что делать.Помогите, пожалуйста!заранее спасибо: D

Ответы [ 3 ]

3 голосов
/ 10 мая 2011

Предполагая, что @Andriy M верен:

  • Данные никогда не занимают более 24 часов
  • , если end_time <= <code>start_time, тогда end_time относится к следующему дню
то, что вы ищете, это:
Declare @GivenTime DateTime
Set @GivenTime = '9:00 PM'
Select ID
  From Rates
 Where (Start_Time<End_Time And Start_Time<=@GivenTime And End_Time>=@GivenTime)
    Or (Start_Time=End_Time And Start_Time=@GivenTime)
    Or (Start_Time>End_Time And (Start_Time>=@GivenTime Or End_Time<=@GivenTime))
0 голосов
/ 10 мая 2011

Я думаю, @gbn тебе не поможет. Я постараюсь заполнить.

Дано - таблица с именем timedata, диапазоны которой превышают не более одного дня

WITH normalized AS
(
   SELECT * 
   FROM timedata
   WHERE datepart(day,start_time) = datepart(day,endtime)
   UNION ALL
   SELECT id, rate, start_time, dateadd(second,dateadd(day,datediff(day,0,end_time),0),-1) as end_time 
   FROM timedata
   WHERE not (datepart(day,start_time) = datepart(day,endtime))
   UNION ALL
   SELECT id, rate,dateadd(day,datediff(day,0,end_time),0) as start_time, end_time
   FROM timedata
   WHERE not (datepart(day,start_time) = datepart(day,endtime))
)
SELECT * 
FROM normalized
WHERE datepart(hour,start_time) < @inhour
  AND datepart(hour,end_time) > @inhour

Это использует CTE и трюк для усечения значений даты и времени. Чтобы понять этот трюк, прочитайте этот вопрос и ответ: Пол даты в SQL-сервере

Вот краткое описание того, что делает этот запрос:

Создать нормализованную таблицу с каждым интервалом времени, превышающим один день, на

  • Выбор всех строк, которые встречаются в один и тот же день.

Тогда для каждой записи, которая охватывает два дня, присоединяясь к

  • Выбор времени начала и одной секунды до следующего дня в качестве времени окончания всего этого промежутка.

и

  • Выбор 12:00 даты окончания в качестве времени начала и времени окончания.

Наконец, вы выполняете выбор, используя индикатор часов на этой нормализованной таблице.

Если ваши диапазоны превышают один день, вам понадобится рекурсивный CTE для получения той же нормализованной таблицы.

0 голосов
/ 09 мая 2011

Я действительно никогда не использую MS SQL, но, возможно, это поможет.

Я собирался предложить что-то подобное, но если вы настроите ваши данные, это не получится.

SELECT id FROM RATES WHERE datepart(hh, start_time) <= 9 AND datepart(hh, end_time) >= 9;

У вас будет поиск по фактической дате, если вы хотите получить верные данные.

SELECT id FROM RATES WHERE start_time <= '2011-1-1 9:00' AND end_time >= '2011-1-1 9:00';

Это может быть не совсем правильно, но это может помочь вам смотреть в правильном направлении.

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