Как выбрать из нескольких диапазонов времени - PullRequest
0 голосов
/ 16 апреля 2019

Допустим, у меня есть таблица в SQLServer с именем Events.Он содержит некоторые события с отметкой времени.

ID  TimeStamp             EventDescription
1   '2019-04-04 08:20'    Machine Error 1
2   '2019-04-04 09:01'    Machine Error 2
3   '2019-04-05 09:23'    Machine Error 3
4   '2019-04-05 12:23'    Machine Error 4
5   '2019-04-06 11:33'    Machine Error 5
6   '2019-04-06 18:07'    Machine Error 6
7   '2019-04-07 12:23'    Machine Error 7

Кроме того, у меня есть вторая таблица с именем Ranges.Он содержит диапазоны времени.

ID  From                  To
1   '2019-04-04 08:00'    '2019-04-04 09:00'
2   '2019-04-05 10:30'    '2019-04-05 16:00' 
3   '2019-04-06 10:00'    '2019-04-06 12:00'

Мне нужно ВЫБРАТЬ события из таблицы Events, где TimeStamp IS между диапазонами времени в таблице Ranges.

Результат:

ID  TimeStamp             EventDescription
1   '2019-04-04 08:20'    Machine Error 1
4   '2019-04-05 12:23'    Machine Error 4
5   '2019-04-06 11:33'    Machine Error 5

Понятия не имеючто делать.Нужно ли использовать динамический SQL для создания этого запроса?

Ответы [ 2 ]

2 голосов
/ 16 апреля 2019

Я создал ваши данные в виде временных таблиц:

SELECT 1 ID,  CAST('2019-04-04 08:20' AS DATETIME) TimeStamp, 'Machine Error 1' EventDescription
INTO #Events
UNION
SELECT 2 ID,  CAST('2019-04-04 09:01' AS DATETIME) TimeStamp, 'Machine Error 2' EventDescription
UNION
SELECT 3 ID,  CAST('2019-04-05 09:23' AS DATETIME) TimeStamp, 'Machine Error 2' EventDescription
UNION
SELECT 4 ID,  CAST('2019-04-05 12:23' AS DATETIME) TimeStamp, 'Machine Error 2' EventDescription
UNION
SELECT 5 ID,  CAST('2019-04-06 11:33' AS DATETIME) TimeStamp, 'Machine Error 2' EventDescription
UNION
SELECT 6 ID,  CAST('2019-04-06 18:07' AS DATETIME) TimeStamp, 'Machine Error 2' EventDescription
UNION
SELECT 7 ID,  CAST('2019-04-07 12:34' AS DATETIME) TimeStamp, 'Machine Error 2' EventDescription


SELECT 1 ID, CAST('2019-04-04 08:00' AS DATETIME) [From], CAST('2019-04-04 09:00' AS DATETIME) [To]
INTO #Ranges
UNION
SELECT 2 ID, CAST('2019-04-05 10:30' AS DATETIME) [From], CAST('2019-04-05 16:00'  AS DATETIME) [To]
UNION
SELECT 3 ID, CAST('2019-04-06 10:00' AS DATETIME) [From], CAST('2019-04-06 12:00' AS DATETIME) [To]

А потом это так же просто, как объединить их:

SELECT E.*
FROM #Ranges R
JOIN #Events E ON E.TimeStamp BETWEEN R.[From] AND R.[To]
2 голосов
/ 16 апреля 2019

Здесь можно использовать коррелированный подзапрос.

Select * from Events E
where exists (select 1 from Ranges where e.TimeStamp between [From] and [To])
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...