[ТЕМА ЗАКРЫТА]
Опции темы
21.04.2011 17:56  
John Doe
Кто предложит самое изящное решение задачи?
Условие: необходимо выводить в запросе 'YES' если sysdate в интервале от 18 до 9 часов :) Неизящный пример для одного часа (18):
Цитата:
select 'YES' from dual where to_char(sysdate,'HH24')='18'
 
21.04.2011 18:03  
John Doe
Цитата:
select 'YES' from dual where (to_char(sysdate,'HH24') between '18' and '24') or (to_char(sysdate,'HH24') between '00' and '09')
считаю неизящным, если что... Интересны другие способы.
 
21.04.2011 18:42  
student
Цитата:
Сообщение от John Doe
Кто предложит самое изящное решение задачи?
Условие: необходимо выводить в запросе 'YES' если sysdate в интервале от 18 до 9 часов :)
насчет "изящного" решения не претендую, но в свое время так же пытлся все сделать одним запросом - успеха особого не принесло - не было универсальности - работало либо от 18 до 9 либо от 9 до 18 - плюнул на это дело и написал ф-цию, которую вставляю в запрос в условие
на входе интервал - на выходе попали\не попали - ф-ция на vba, но адаптировать проблем наверное не будет

Public Function m_TimeInterval(swT1 As String, swT2 As String) As Boolean
On Error Resume Next

Dim swD1 As Date, swD2 As Date, swD3 As Date, swD As Date, swCHANGE As Boolean
swCHANGE = False
swD = CDate(Format$(Now(), "hh:nn"))
swD1 = CDate(swT1)
swD2 = CDate(swT2)
If swD2 < swD1 Then
swCHANGE = True
swD3 = swD2
swD2 = swD1
swD1 = swD3
End If
If swCHANGE = False Then
If swD > swD1 And swD < swD2 Then
m_TimeInterval = True
Else
m_TimeInterval = False
End If
Else
If swD > swD1 And swD < swD2 Then
m_TimeInterval = False
Else
m_TimeInterval = True
End If
End If

End Function

плюсом получилось что использовать можно отдельно от запроса - т.е. сам запрос запускать предварительно проверив условие - меньше накладных расходов
 
22.04.2011 04:58  
whitewizard
select 'YES' from dual where ((to_char(sysdate,'HH24')-9) between '9' and '24');
 
22.04.2011 10:17  
John Doe
Извините, я покритикую, но student предложил тоже самое, что и я раньше, а whitewizard помимо неявного преобразования допустил алгоритмическую ошибку, to_char(sysdate,'HH24')-9 в 7 часов утра будет равным -2, например.
 
22.04.2011 10:32  
vdm
9 часов включая или не ?
В общем, от обратного:

Код:
select 'YES' from dual
where TO_CHAR(SYSDATE, 'HH24') not between 9 and 17;
 
22.04.2011 10:48  
John Doe
Зря я, наверное, пример дал. Суть не в том, чтобы украсивить его конкретно, а придумать универсальное решение для определения интервала времени, независимо от того, есть ли в нем переход в другие сутки.
 
22.04.2011 11:41  
student
Цитата:
Сообщение от John Doe
Извините, я покритикую, но student предложил тоже самое, что и я раньше
не совсем так - это универсальная ф-ция, которая не зависит от временных интервалов - можно задавать как при переходе через ноль так и без него - достаточно в одном месте поменять интервал не ползая по тексту запроса, плюс как я писал выше - можно ее использовать для выполнения кучи однотипных запросов, проверив интервал один раз, а если есть необходимость проверять не только текущее время, то можно добавить его в параметры и не зависить от входных условий
 
22.04.2011 11:44  
John Doe
понятно, но по сути - это просто усложненный запрос, который я предложил, только без between, а с < AND >
 
22.04.2011 12:07  
student
Цитата:
Сообщение от John Doe
понятно, но по сути - это просто усложненный запрос, который я предложил, только без between, а с < AND >
согласен, только в access (в др средах не проверял) план запроса остается постоянным и не требуется его перекомпиляция при изменении условий - хоть мелкая, но все таки экономия
 
 
Опции темы



Часовой пояс GMT +3, время: 13:19.

Все в прочитанное - Календарь - RSS - - Карта - Вверх 👫 Яндекс.Метрика
Форум сделан на основе vBulletin®
Copyright ©2000 - 2016, Jelsoft Enterprises Ltd. Перевод: zCarot и OlegON
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.