Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

прошу помощи составить запрос


Страницы:   1 2

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.


Страницы:   1 2

Наверх

Титульная страница Поиск, карта сайта Написать письмо