Member 11466758 Ответов: 2

Как фильтровать временные интервалы в SQL server 2008


я должен найти точный идентификатор столбца, где мое текущее время лежит между временными интервалами в столбце временного интервала.
моя структура таблицы такова:
id        timeslot
1     12:00 AM To 02:00 AM
2     02:00 AM To 04:00 AM
3     04:00 AM To 06:00 AM
4     06:00 AM To 08:00 AM
5     08:00 AM To 10:00 AM
6     10:00 AM To 12:00 PM
7     12:00 PM To 02:00 PM
8     02:00 PM To 04:00 PM
9     04:00 PM To 06:00 PM
10    06:00 PM To 08:00 PM
11    08:00 PM To 10:00 PM
12    10:00 PM To 12:00 AM


например: "2:58 вечера" лежит между
02:00 PM To 04:00 PM
Итак, id - это "8"
мне нужно это удостоверение

Что я уже пробовал:

SELECT [id],[CollectionTimeSlot]

  FROM tbl_CollectionTimeSlot  WHERE '2:40 PM' BETWEEN convert(nvarchar(20),  SUBSTRING([CollectionTimeSlot] ,0, CHARINDEX('To', [CollectionTimeSlot]) ),108) 
  AND convert(nvarchar(20),SUBSTRING([CollectionTimeSlot] , CHARINDEX('To', [CollectionTimeSlot])+3,LEN([CollectionTimeSlot]))) 

ALSO TRIED ANOTHER ONE :

SELECT [id],[CollectionTimeSlot]
FROM tbl_CollectionTimeSlot  WHERE '04:05 AM'>= convert(nvarchar(20),  SUBSTRING([CollectionTimeSlot] ,0, CHARINDEX('To', [CollectionTimeSlot]) ),110)   
  AND '04:05 AM'<= convert(nvarchar(20),SUBSTRING([CollectionTimeSlot] , CHARINDEX('To', [CollectionTimeSlot])+3,LEN([CollectionTimeSlot]))) 

КОТОРЫЕ ДАЮТ МНЕ РЕЗУЛЬТАТ КАК:
идентификатор CollectionTimeSlot
1 с 12: 00 до 02: 00
7 12: 00 вечера до 02: 00 вечера
МНЕ НУЖНО ТОЧНОЕ УДОСТОВЕРЕНИЕ ЛИЧНОСТИ

2 Ответов

Рейтинг:
2

KapilMuni

Create    table #CollectionTimeSlot
(
	id int identity(1,1),
	Timeslot VARCHAR(100),
	
)
insert into #CollectionTimeSlot values
('12:00 AM To 02:00 AM'),
('02:00 AM To 04:00 AM'),
('04:00 AM To 06:00 AM'),
('06:00 AM To 08:00 AM'),
('08:00 AM To 10:00 AM'),
('10:00 AM To 12:00 PM'),
('12:00 PM To 02:00 PM'),
('02:00 PM To 04:00 PM'),
('04:00 PM To 06:00 PM'),
('06:00 PM To 08:00 PM'),
('08:00 PM To 10:00 PM'),
('10:00 PM To 12:00 AM')


SELECT * FROM #CollectionTimeSlot 

DECLARE @testTime2 TIME = CAST('02:58 PM' AS TIME)
Select @testTime2

SELECT * FROM #CollectionTimeSlot 

WHERE @testTime2 BETWEEN CAST(Left(Timeslot,8) as TIME) AND CAST(Right(Timeslot,8) as TIME) 


CHill60

Во многом скопировано с моего. Было бы лучше указать, что я мог бы использовать LEFT и RIGHT вместо SUBSTR

KapilMuni

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

Рейтинг:
0

CHill60

Этот запрос будет работать с вашей текущей конструкцией таблицы до тех пор, пока временные данные находятся в правильном длинном формате - то есть с предыдущими нулями на значениях меньше 10.

DECLARE @testTime TIME = CAST('02:58 PM' AS TIME)

SELECT [id],[CollectionTimeSlot], 
		CAST(SUBSTRING([CollectionTimeSlot],1,8) AS TIME), 
		CAST(SUBSTRING([CollectionTimeSlot],13,8) AS TIME)
FROM tbl_CollectionTimeSlot  
WHERE @testTime BETWEEN CAST(SUBSTRING([CollectionTimeSlot],1,8) AS TIME) AND CAST(SUBSTRING([CollectionTimeSlot],13,8) AS TIME)
Промежуток между утверждением WHERE точно такой же, как и высказывание
WHERE @testTime >= CAST(SUBSTRING([CollectionTimeSlot],1,8) AS TIME) AND @testTime <= CAST(SUBSTRING([CollectionTimeSlot],13,8) AS TIME)


Однако это ужасная схема таблицы!
Всегда используйте правильный тип данных для столбцов таблицы. Varchar (или char, или nvarchar или nchar) - это нет соответствующие типы данных для временных данных.

Так было бы лучше:
create table CollectionTimeSlot
(
	id int identity(1,1),
	startTime TIME,
	endTime TIME
)
insert into CollectionTimeSlot values
('12:00 AM','02:00 AM'),
('02:00 AM','04:00 AM'),
('04:00 AM','06:00 AM'),
('06:00 AM','08:00 AM'),
('08:00 AM','10:00 AM'),
('10:00 AM','12:00 PM'),
('12:00 PM','02:00 PM'),
('02:00 PM','04:00 PM'),
('04:00 PM','06:00 PM'),
('06:00 PM','08:00 PM'),
('08:00 PM','10:00 PM'),
('10:00 PM','12:00 AM')
Тогда запрос данных становится тривиальным
DECLARE @testTime2 TIME = CAST('02:58 PM' AS TIME)

SELECT * FROM CollectionTimeSlot 
WHERE @testTime2 BETWEEN startTime AND endTime