![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
прошу помощи составить запрос
stud © (2005-06-23 15:54:00)есть таблица, в которой регистрируются определенные события
необходимо сделать выборку по времени до 15:00. с 15:00 до 23:00 и с 23:00 до 8:00
с первыми двумя интервалами проблем нет, но вот с третьим??? тут происходит переход через сутки.
возможно ли такое?
stud (2005-06-23 17:03:00) [1]есть таблица:
"дата" "время"
на каждый месяц отдельная таблица.
каждая запись - это событие т.е. когда оно произошло и во сколько.
необходимо получить выборку вида :
дата с_8до_15 с_15_до_23 с_23_до_8
01,01,01 5 10 15
02,01,01 1 9 20
......
т.е. для столбца с_23_До_8 происходит смена даты вот в этой смене и загвоздка. данные с 00:00 до 8:00 2 числа должны отображать 1 числа и т.д.
stud (2005-06-23 16:57:00) [2]
> не стоит делать "таблицу на каждый месяц", хотя к
> твоей проблемке это и не относится.
это не мне нужно говорить а разработчикам системы контроля доступа)))
Zacho (2005-06-23 16:52:00) [3]Мой тебе совет: во-первых, для начала напиши всё это без execute statement и ХП. Гораздо легче и тебе, и нам, будет понять что именно тебе нужно и в чём именно утебя проблема.
Во-втрых: не стоит делать "таблицу на каждый месяц", хотя к твоей проблемке это и не относится.
evvcom (2005-06-23 16:47:00) [4]
> это и есть дата события
Можно пальцем ткнуть, где в вопросе сказано что-нибудь про дату?
stud (2005-06-23 16:45:00) [5]смысл запроса - таблица содержит данные за месяц и нужно вывести количество событий по дням и каждый день разбить на интервалы.
Zacho (2005-06-23 16:38:00) [6]stud © (23.06.05 16:34) [21]
' WHERE ((trantime between '||'''23:00:01'''||' and '||'''23:59:59'''||' and trandate='||cast(:t_date as varchar (10))||') '||
' or (trantime between '||'''7:59:59'''||' and '||'''7:59:59'''||' and trandate='||cast(:t_date+1 as varchar (10))||')'||
Зачем такие извращения ???
stud (2005-06-23 16:34:00) [7]вот пытаюсь "добить" этот запрос
for execute statement 'SELECT distinct trandate FROM ' ||tn into :t_date do
begin
for execute statement
' select trandate, count(*) from '||tn||
' WHERE ((trantime between '||'''23:00:01'''||' and '||'''23:59:59'''||' and trandate='||cast(:t_date as varchar (10))||') '||
' or (trantime between '||'''7:59:59'''||' and '||'''7:59:59'''||' and trandate='||cast(:t_date+1 as varchar (10))||')'||
' group by trandate order by trandate' into :trandate_,:po23
do suspend;
end
Zacho (2005-06-23 16:34:00) [8]stud © (23.06.05 15:54)
возможно ли такое?
Да, как уже намекнул Ega23 используй тип полей TIMESTAMP.
Например,
SELECT * FROM MY_FIELD
WHERE MY_TIMESTAMP_FIELD BETWEEN :timestamp_1 AND :timestamp_2
stud © (23.06.05 16:02) [6]
сейчас в базе два поля дата и время.
Можно и так, только запрос будет немного сложней.
SELECT * FROM MY_FIELD
WHERE (MY_DATE_FIELD BETWEEN :date_1 AND :date_2) AND (MY_TIME_FIELD BETWEEN :time_1 AND :time_2)
stud © (23.06.05 16:03) [7]
Бред какой-то :) Что именно ты хотел сделать ?
И забудь пока про EXECUTE STATEMENT и агрегаты, попробуй без них, заодно и нам проще отвечать будет :)
TQuery (2005-06-23 16:30:00) [9]Разбей 23:00 до 8:00
на 23:00 - 24:00 и 00:00 - 08:00
Сделай два запроса (у четом даты), а потом результаты "просуммируй"
Sergey13 (2005-06-23 16:30:00) [10]В догонку. Мой "Интервал" это поле ссылка на таблицу интервалов.
Sergey13 (2005-06-23 16:28:00) [11]2[13] stud © (23.06.05 16:23)
> дата не пофиг, с чего вы решили?
Да так, показалось. 8-)
Я бы наверное вообще добавил поле нечто вроде "Интервал". В таких делах (при переходе периода) вообще многое зависит от способа интерпретации.
stud (2005-06-23 16:26:00) [12]
> А зачем тебе trandate?
это и есть дата события
> И еще, используй вместо "23:00:01"
хотя бы так сделать))
stud (2005-06-23 16:24:00) [13]
> for execute statement 'SELECT distinct trandate FROM '
>||tn||' into:t_date do '||
> 'for select trandate, count(*) from '||tn||
ругается вот на этот into
evvcom (2005-06-23 16:24:00) [14]А зачем тебе trandate? Изначально в вопросе этого не звучало. используй только trantime. И еще, используй вместо "23:00:01" параметр, иначе нарвешься рано или поздно на ошибку, связанную с региональными настройками.
stud (2005-06-23 16:23:00) [15]
> Если тебе дата пофиг
дата не пофиг, с чего вы решили?
по ней сумой идет группировка! нужно знать количество операций по дням и по времени в течение дня
Sergey13 (2005-06-23 16:20:00) [16]2[11] stud © (23.06.05 16:10)
Если тебе дата пофиг, то почему бы не так (скелет, как идея)
select * from table
where time<'8.00' or time>'23.00'
stud (2005-06-23 16:10:00) [17]вот вроде вариант, не лучший наверное но
for execute statement 'SELECT distinct trandate FROM ' ||tn||' into :t_date do '||
'for select trandate, count(*) from '||tn||
' WHERE ((trantime>='||'''23:00:01'''||' and '||' trandate=t_date) '||
' and (trantime<='||'''7:59:59'''||' and trandate=t_date+1))'||
' group by trandate order by trandate' into :trandate_,:po23
do suspend;
пока не работает...
stud (2005-06-23 16:07:00) [18]
> А привести их к datetime никак?
зачем?????? чем это упрощает задачу?
Ega23 (2005-06-23 16:06:00) [19]сейчас в базе два поля дата и время.
А привести их к datetime никак?
Johnmen (2005-06-23 16:06:00) [20]>stud ©
Используй EXTRACT.