Jaa Zaib Ответов: 3

Как получить true false, если наступит определенное время


Привет,
Я создаю приложение, которое работает 24 часа в сутки. У меня есть таблица с названием PrayerTimes. Я хочу показать клиентам уведомление о том, что пришло время молитвы. Я хочу, чтобы запрос возвращал True или False. Истина должна начинаться до 5 минут времени молитвы и через 30 минут после времени молитвы...

Скажем, если следующее время молитвы 2016-10-23 15: 23: 00.000, то "истина" будет с 2016-10-23 15: 18:00.000 до 2016-10-23 15:53: 00.000, иначе должно вернуться "ложь".

Пожалуйста, помогите мне построить запрос или любую хранимую процедуру, чтобы вернуть только True или False. Вот таблица молитв

ID	PRAYER_ID	        TIME
775	5	                2016-10-23 19:20:00.000
776	1	                2016-10-24 05:04:00.000
777	2	                2016-10-24 12:05:00.000
778	3	                2016-10-24 15:23:00.000
779	4	                2016-10-24 17:50:00.000
780	5	                2016-10-24 19:20:00.000

What I have tried:

SELECT CAST(
CASE 
WHEN DATEDIFF(minute, GETDATE(), TIME) > -5 AND DATEDIFF(minute, GETDATE(), TIME) < 30 
THEN 1 
ELSE 0 
END AS bit) as TIME, GETDATE() 
FROM prayertimes

it's always 0

3 Ответов

Рейтинг:
8

Jaa Zaib

SELECT TOP 1 CAST(
CASE
WHEN DATEDIFF(minute, GETDATE(), pTIME) >= -30 AND DATEDIFF(minute, GETDATE(), pTIME) <= 5
THEN 1
ELSE 0
END AS bit) as true_false, pTIME, getdate(), datediff(minute,getdate(),pTIME), DATEADD(MINUTE, -1, GETDATE())
FROM prayertimes
where DATEADD(MINUTE, -30, GETDATE()) <= pTIME order by pTIME asc


Рейтинг:
20

Wendelius

Не уверен, правильно ли я понимаю это требование, но если вам нужно только знать, есть ли сейчас время молитвы, зачем извлекать все строки из таблицы PrayerTimes? Почему бы просто не проверить, пришло ли время.

Например, следующий запрос вернет строку 5, начинающуюся за 5 минут до молитвы и заканчивающуюся через 30 минут после нее. Если строка возвращается, то это время, если строки не возвращаются, то это не время

SELECT pt.[Time], 1 AS PrayerTime
FROM PrayerTimes pt
WHERE pt.[Time] BETWEEN DATEADD(MINUTE, -5, GETDATE()) AND DATEADD(MINUTE, 30, GETDATE())


Рейтинг:
0

OriginalGriff

Ну да, так и будет. Первый раз сегодня в 19: 20, а все остальные-завтра. DATEDIFF включает в себя Год, месяц и день, когда он его вычисляет.
Попробуй:

SELECT CAST(
CASE WHEN DATEDIFF(minute, GETDATE(), [TIME]) > -5 AND DATEDIFF(minute, GETDATE(), [TIME]) < 30 
THEN 1 
ELSE 0 
END AS bit) as TIME, GETDATE() 
FROM prayertimes