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, время: 11:42.

Форум на базе vBulletin®
Copyright © Jelsoft Enterprises Ltd.
В случае заимствования информации гипертекстовая индексируемая ссылка на Форум обязательна.