Jaydeep Shah Ответов: 2

Сравнение времени в mssql


У меня есть список ресторанов с разным временем открытия и закрытия.
Я хочу дать ярлык открытым или закрытым в соответствии с текущим временем.

У меня есть название ресторана, время открытия, время закрытия

я.е TAjHOtel, 10:00 АМ 07:00 часов

Я требовал результата, такого как название отеля, открыть или закрыть

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

select CONVERT(varchar(10),CAST(getdate() AS TIME),100)   --get current time

DECLARE @DayNumber bigint  
DECLARE @CurrentTime nvarchar(10) 
set @DayNumber =  datepart(dw,getdate())  --get current day in number

 set @CurrentTime = CONVERT(varchar(10),CAST(getdate() AS TIME),100)

select resto.RestaurantName,resto.FoodPrepareTime,ram.OpeningTime,ram.ClosingTime FROM Restaurant Resto join RestaurantAvailablityMaster 
RAM on resto.RestaurantId  = ram.RestaurantId where RAM.DayId = @DayNumber 

2 Ответов

Рейтинг:
17

TarunShrivastav

Создать таблицу TestH
(
HName varchar(100),
Время Открытия,
Время Закрытия
)

Вставить в TestH значения('T1','11:00AM','11:00PM')


Выберите * из теста
Как вы можете видеть ниже при сохранении времени закрытия он был неявно преобразован в формат 24 часа

HName Значениями Открытия И Закрытия CloseTime
Т1 11:00:00.0000000 23:00:00.0000000

Если ниже Proc return 1 то вы можете пометить его как открытый в противном случае закрыть
Процесса ---
Создайте процедуру [dbo].[TestHSP]
АС
НАЧАТЬ

Объявить @флаговый бит
Объявить @CurrentTime nvarchar(10)
объявить @времени значениями открытия и закрытия
объявить время @closetime
выберите @значениями открытия и закрытия = значениями открытия и закрытия от TestH
выберите @closetime=CloseTime из TestH
set @CurrentTime= CONVERT(varchar(10),CAST(getdate() AS TIME),100)
если(@текущее время&ГТ;@значениями открытия и закрытия и @текущее время в<@closetime)
set @Flag=1
еще
set @flag=0
return @flag

КОНЕЦ
ГО


CHill60

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

Рейтинг:
10

CHill60

Решение 1 прекрасно, но немного перегружено инженерией. Просто измените существующий запрос, чтобы использовать CASE заявление

select resto.RestaurantName,resto.FoodPrepareTime,ram.OpeningTime,ram.ClosingTime , 
CASE WHEN @CurrentTime >= ram.OpeningTime AND @CurrentTime <= ram.ClosingTime THEN 'Open' ELSE 'Closed' ENDFROM #Restaurant Resto 
join #RestaurantAvailablityMaster RAM on resto.RestaurantId  = ram.RestaurantId 
where RAM.DayId = @DayNumber

Нет абсолютно никакой необходимости использовать CONVERT при обработке times - Вы меняете объект time на объект varchar, который служит только для замедления вашего запроса. На самом деле вы могли бы вообще избавиться от переменных...
select resto.RestaurantName,resto.FoodPrepareTime,ram.OpeningTime,ram.ClosingTime , 
CASE WHEN CAST(getdate() AS TIME) >= ram.OpeningTime AND CAST(getdate() AS TIME) <= ram.ClosingTime THEN 'Open' ELSE 'Closed' END
FROM #Restaurant Resto 
join #RestaurantAvailablityMaster RAM on resto.RestaurantId  = ram.RestaurantId 
where RAM.DayId = datepart(dw,getdate())