Гость
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод данных за день в разрезе времени / 20 сообщений из 20, страница 1 из 1
17.05.2017, 08:16
    #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
17.05.2017, 08:23
    #39454307
Вывод данных за день в разрезе времени
Gallemar,

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

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

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

Второе. Входной параметр используется как переменная. Не знаю можно ли так делать, но я бы в любом случае заводил локальную переменную в процедуре, для таких манипуляций.
...
Рейтинг: 0 / 0
17.05.2017, 09:07
    #39454330
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных за день в разрезе времени
fraks, первый диалект
...
Рейтинг: 0 / 0
17.05.2017, 09:11
    #39454331
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных за день в разрезе времени
fraksВторое. Входной параметр используется как переменная. Не знаю можно ли так делать, но я бы в любом случае заводил локальную переменную в процедуре, для таких манипуляций.
А как тогда? Ты же видишь, у меня выборка с between. Если только вместо while (TIME_2 < '2017.05.17 00:00') сделать классическую переменную a la i=i+1
...
Рейтинг: 0 / 0
17.05.2017, 09:15
    #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
17.05.2017, 09:41
    #39454356
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных за день в разрезе времени
Gallemar,

Что "не помогло"? По-прежнему 147 строк?
...
Рейтинг: 0 / 0
17.05.2017, 09:52
    #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
17.05.2017, 10:16
    #39454384
Gallemar
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных за день в разрезе времени
WildSeryGallemar,

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

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

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

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

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

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

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

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

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

Почему не можешь?
...
Рейтинг: 0 / 0
17.05.2017, 12:00
    #39454512
WildSery
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных за день в разрезе времени
fraks...вопрос по поводу between - никогда не мог запомнить включает он в себя границы значений или нетВсегда включает, чего тут запоминать?
...
Рейтинг: 0 / 0
17.05.2017, 12:10
    #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
17.05.2017, 12:16
    #39454527
fraks
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Вывод данных за день в разрезе времени
Gallemar,

Ну и чисто по общему дизайну процедуры, я бы во входных параметрах задавал начальную и конечную дату (а не в константе), ширина временного окна и так захардкожена, нет смысла обязывать зачем-то задавать вторую дату на входе в соответствии с этим жестким кодом.
...
Рейтинг: 0 / 0
17.05.2017, 12:31
    #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
Форумы / Firebird, InterBase [игнор отключен] [закрыт для гостей] / Вывод данных за день в разрезе времени / 20 сообщений из 20, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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