powered by simpleCommunicator - 2.0.52     © 2025 Programmizd 02
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод данных за день в разрезе времени
20 сообщений из 20, страница 1 из 1
Вывод данных за день в разрезе времени
    #39454305
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый день
Не понимаю в чем беда, написал процедуру, но она выдает некорректные данные
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create or alter procedure ZM_PROCEDURE (
    TIME_2 date,
    TIME_1 date)
returns (
    COUNT_1 integer)
as
begin
while (TIME_2 < '2017.05.17 00:00')
do
begin
   select count(LG.KEYS)
      from log LG
      join DOCHEAD DH on cast(LG.KEYS as integer) = DH.ID_DOCHEAD
      join CLIENTS CL on CL.ID_CLIENTS = DH.CLIENT2_INDEX
      where LG.MANAGER = 1874 and
            LG.ACT = 'ACCEPT' and
            LG.MODDATE between :TIME_1 and :TIME_2 and
            LG.OBJECT = 'DOCHEAD' and
            DH.DOCTYPE in (1267, 1269) and
            DH.DOCHEAD_FILIALINDEX = 141 
      into :COUNT_1;
        TIME_1 = dateadd ( 1 hour  to TIME_1);
   TIME_2 = dateadd  (1 hour  to TIME_2);
      suspend;
          end
end
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454307
Gallemar,

в чем именно некорректность данных - предлагается догадаться?
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454311
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Добрый Э - ЭхGallemar,

в чем именно некорректность данных - предлагается догадаться?
Привет, Паша
Выдает 147 строк, хотя по условию перебирается время до 23 часов, ну и в самой выборе данные от 0 до 11, хотя если запрос руками выполняешь данные гораздо больше.
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454325
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Первое что бросается в глаза - параметр TIME_2 date, а прибавляешь часы. У date часов нет. Зависит от диалекта конечно...

Второе. Входной параметр используется как переменная. Не знаю можно ли так делать, но я бы в любом случае заводил локальную переменную в процедуре, для таких манипуляций.
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454330
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks, первый диалект
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454331
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksВторое. Входной параметр используется как переменная. Не знаю можно ли так делать, но я бы в любом случае заводил локальную переменную в процедуре, для таких манипуляций.
А как тогда? Ты же видишь, у меня выборка с between. Если только вместо while (TIME_2 < '2017.05.17 00:00') сделать классическую переменную a la i=i+1
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454332
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вот так, но не помогло
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
create or alter procedure ZM_PROCEDURE (
    TIME_2 date,
    TIME_1 date)
returns (
    COUNT_1 integer)
as
declare variable I  integer = 0;
begin

while (i < 15) do
begin
   select count(LG.KEYS)
      from log LG
      join DOCHEAD DH on cast(LG.KEYS as integer) = DH.ID_DOCHEAD
      join CLIENTS CL on CL.ID_CLIENTS = DH.CLIENT2_INDEX
      where LG.MANAGER = 1874 and
            LG.ACT = 'ACCEPT' and
            LG.MODDATE between :TIME_1 and :TIME_2 and
            LG.OBJECT = 'DOCHEAD' and
            DH.DOCTYPE in (1267, 1269) and
            DH.DOCHEAD_FILIALINDEX = 141
      into :COUNT_1;
        TIME_1 = dateadd (1 hour  to TIME_1);
        TIME_2 = dateadd  (1 hour  to TIME_2);
        i=i+1;
      suspend;
          end
end

...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454356
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Что "не помогло"? По-прежнему 147 строк?
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454362
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Отформатировал процедуру по своим стандартам, получилось так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
create or alter procedure ZM_PROCEDURE (
    TIME_2 date,
    TIME_1 date)
returns (
    COUNT_1 integer)
as
begin
  while (TIME_2 < '2017.05.17 00:00') do begin
    --
    select count(LG.KEYS)
      from log LG
        join DOCHEAD DH on cast(LG.KEYS as integer) = DH.ID_DOCHEAD
        join CLIENTS CL on CL.ID_CLIENTS = DH.CLIENT2_INDEX
      where (LG.MANAGER = 1874)
        and (LG.ACT = 'ACCEPT')
        and (LG.MODDATE between :TIME_1 and :TIME_2)
        and (LG.OBJECT = 'DOCHEAD')
        and (DH.DOCTYPE in (1267, 1269))
        and (DH.DOCHEAD_FILIALINDEX = 141)
      into :COUNT_1;
    --
    TIME_1 = dateadd ( 1 hour  to TIME_1);
    TIME_2 = dateadd  (1 hour  to TIME_2);
    suspend;
  end -- while
end



Количество выводимых записей - это количество часов между переданным в процедуру значением time_2 и заданной в процедуре константой. Ни от каких данных в процедуре количество выдаваемых записей не зависит. Поскольку передаваемое в процедуру значения ты не озвучил - то и непонятно какие цифры ты ожидал увидеть и какие получил, и что не так как ты ожидал.

Если из процедуры выкинуть все что не влияет на количество записей на выходе то останется вот это:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
create or alter procedure ZM_PROCEDURE (
    TIME_2 date,
    TIME_1 date)
returns (
    COUNT_1 integer)
as
begin
  while (TIME_2 < '2017.05.17 00:00') do begin
    --
    TIME_2 = dateadd  (1 hour  to TIME_2);
    suspend;
  end -- while
end



но тут уже как бы совсем просто ошибку найти.
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454384
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
WildSeryGallemar,

Что "не помогло"? По-прежнему 147 строк?
нет,теперь с этим порядок, в самой выборке данные не соответствуют действительности
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454396
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarWildSeryGallemar,

Что "не помогло"? По-прежнему 147 строк?
нет,теперь с этим порядок, в самой выборке данные не соответствуют действительности

По поводу данных - сама процедура выглядит как-то странно.

Ты задаешь параметрами некое временное окно, запросом узнаешь количество неких записей в этом временном окне.
Затем сдвигаешь это окно на час вперед и снова смотришь.
Скорее всего у тебя при сдвижке окна бОльшая часть записей попадает в следующее окно, повторяясь.
Физический смысл таких данных я не могу постичь. :) Разве что окно шириной ровно в 1 час, но тогда смысл задавать его извне непонятен.
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454397
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksGallemar,
Количество выводимых записей - это количество часов между переданным в процедуру значением time_2 и заданной в процедуре константой. Ни от каких данных в процедуре количество выдаваемых записей не зависит. Поскольку передаваемое в процедуру значения ты не озвучил - то и непонятно какие цифры ты ожидал увидеть и какие получил, и что не так как ты ожидал.

Входные данные:
TIME_1 '16.05.2017 08:00:00'
TIME_2 '16.05.2017 09:00:00'
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454425
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Надеюсь, что ты учёл, что входные параметры у тебя в обратном порядке?
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454488
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Далее у меня бы возник вопрос по поводу between - никогда не мог запомнить включает он в себя границы значений или нет, поэтому вместо between я всегда пишу просто два условия.

Код: plsql
1.
((data >= :data1) and (data < :data2))
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454505
Фотография Gallemar
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraksGallemar,
Далее у меня бы возник вопрос по поводу between - никогда не мог запомнить включает он в себя границы значений или нет, поэтому вместо between я всегда пишу просто два условия.

[/src]
Оказалось в этом проблема, спасибо. Вопрос ещё можно? Я же не смогу в результат выборки добавить сам временной интервал, в котором считалось кол-во документов?
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454509
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Почему не можешь?
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454512
WildSery
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
fraks...вопрос по поводу between - никогда не мог запомнить включает он в себя границы значений или нетВсегда включает, чего тут запоминать?
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454524
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
GallemarfraksGallemar,
Далее у меня бы возник вопрос по поводу between - никогда не мог запомнить включает он в себя границы значений или нет, поэтому вместо between я всегда пишу просто два условия.

[/src]
Оказалось в этом проблема, спасибо. Вопрос ещё можно? Я же не смогу в результат выборки добавить сам временной интервал, в котором считалось кол-во документов?

Данные на выход выдаются по suspend. Что к этому времени в них будет лежать - то и выдаст.
Примерно так я бы делал:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
create or alter procedure ZM_PROCEDURE (
    TIME_2 date,
    TIME_1 date)
returns (
    COUNT_1 integer,
    DATA1 date,
    DATA2 date
)
as
begin
  while (TIME_2 < '2017.05.17 00:00') do begin
    --
...
    --
    DATA1 = TIME_1;
    DATA2 = TIME_2;
    suspend;
    TIME_1 = dateadd ( 1 hour  to TIME_1);
    TIME_2 = dateadd  (1 hour  to TIME_2);
  end -- while
end
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454527
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Gallemar,

Ну и чисто по общему дизайну процедуры, я бы во входных параметрах задавал начальную и конечную дату (а не в константе), ширина временного окна и так захардкожена, нет смысла обязывать зачем-то задавать вторую дату на входе в соответствии с этим жестким кодом.
...
Рейтинг: 0 / 0
Вывод данных за день в разрезе времени
    #39454542
fraks
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как-то так:

Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
create or alter procedure ZM_PROCEDURE (
    DATE_START date,
    DATE_END   date
    )
returns (
    COUNT_1 integer,
    DATE1   date,
    DATE2   date
    )
as
begin
  DATE1 = TIME_START;
  while (DATE1 < TIME_END) do begin
    --
    DATE2 = dateadd (1 hour to DATE1); -- единственное место где задается шаг окна
    --
    select count(LG.KEYS)
      from log LG
        join DOCHEAD DH on cast(LG.KEYS as integer) = DH.ID_DOCHEAD
        join CLIENTS CL on CL.ID_CLIENTS = DH.CLIENT2_INDEX
      where (LG.MANAGER = 1874)
        and (LG.ACT = 'ACCEPT')
        and (LG.MODDATE >= :DATE1)
        and (LG.MODDATE <  :DATE2)
        and (LG.OBJECT = 'DOCHEAD')
        and (DH.DOCTYPE in (1267, 1269))
        and (DH.DOCHEAD_FILIALINDEX = 141)
      into :COUNT_1;
    --
    suspend;
    --
    DATE1 = DATE2;
  end -- while
end
...
Рейтинг: 0 / 0
20 сообщений из 20, страница 1 из 1
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод данных за день в разрезе времени
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]