SQL - поиск по дате и времени, которого нет в записях таблицы - PullRequest
0 голосов
/ 28 сентября 2011

Нужно мнение эксперта здесь:

Я пытаюсь реализовать сценарий в одном из наших проектов, который отображает график, основанный на пользовательском вводе, и один из входных данных представляет собой диапазон даты и времени. Позвольте мне описать с примером.

Рассмотрим пример, в котором есть записи, имеющие start-date-time = 2011-09-28 9:30 и end-date-time = 2011-09-28 11:30. Допустим, пользователь пытается просмотреть график для диапазона даты-времени 2011-09-28 10:00 to 2011-09-28 11:00 - теперь система должна отображать график, поскольку данные доступны за указанный период (так как 10 - 11 находится в пределах 9.30 - 11.30).

Как мне реализовать этот сценарий и как искать такие входные данные?

Примечание: Возможно, слишком много строк для конкретной даты / даты-времени

Спасибо.

Ответы [ 4 ]

1 голос
/ 28 сентября 2011

Это зависит от того, нужно ли вам следить за тем, чтобы весь диапазон дат, введенный пользователем, охватывался графиком в вашей таблице.Если вам это нужно, то вы должны убедиться, что время начала и окончания пользователя находятся между значениями в базе данных.Следовательно:

select * from graph_table t
where @user_start_time between t.graph_range_start and t.graph_range_end
and @user_end_time between t.graph_range_start and t.graph_range_end
limit 1;

Вам нужно будет решить, как обрабатывать возвращающиеся несколько строк (я только что использовал LIMIT 1 здесь).

Если вы хотите вернуть какие-либо графикикоторые охватывают либо время начала, либо время окончания пользователя, затем измените 'и' в запросе на 'или', следовательно:

select * from graph_table t
where (@user_start_time between t.graph_range_start and t.graph_range_end)
or (@user_end_time between t.graph_range_start and t.graph_range_end)
limit 1;

Опять же, вам придется решить, как вы хотите обработатьнесколько результатов здесь.

1 голос
/ 28 сентября 2011

Вы можете использовать:

SELECT * FROM your_table tb
WHERE 
  (  user_start_time <= tb.start_date_time AND 
     user_end_time >= tb.start_date_time
  ) OR (
     user_start_time <= tb.end_date_time AND 
     user_end_time >= tb.end_date_time
  ) OR (
     user_start_time >= tb.start_date_time AND 
     user_end_time <= tb.end_date_time
  )
0 голосов
/ 15 февраля 2013
SELECT * FROM your_table tb
WHERE NOT (
    tb.start_date_time > user_end_time 
  AND 
    tb.end_date_time < user_start_time
)

Попробуйте это.Содержит следующие сценарии и возвращает результаты: условие (интервал поиска): user_start_time = 2011-09-28 9:30 и user_end_time = 2011-09-28 11: 30

  • tb.start_date_time = 2011-09-28 08:30 и tb.end_date_time = 2011-09-28 12: 30
  • tb.start_date_time = 2011-09-28 10:30 и tb.end_date_time = 2011-09-28 11:00
  • tb.start_date_time = 2011-09-28 10:30 и tb.end_date_time = 2011-09-28 12: 30
  • tb.start_date_time = 2011-09-28 08:30 иtb.end_date_time = 2011-09-28 10: 30

Исключения:

  • tb.start_date_time = 2011-09-28 07:30 и tb.end_date_time = 2011-09-28 08: 30
  • tb.start_date_time = 2011-09-28 12:30 и tb.end_date_time = 2011-09-28 13: 30
0 голосов
/ 28 сентября 2011

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

SELECT * FROM TableName 
WHERE (@StartDate >=  start-date-time AND @StartDate <= end-date-time) 
OR 
(@EndDate >= start-date-time AND @EndDate <= end-date-time)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...