powered by simpleCommunicator - 2.0.53     © 2025 Programmizd 02
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL, написание цикла
8 сообщений из 8, страница 1 из 1
SQL, написание цикла
    #39936271
Юлия0694
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Есть таблица с почасовым данными счетчиков.
Пользователь выбирает на клиенте период, допустим с 01.03.2020 по 11.03.2020 и выбирает 1 смену (она длится с 23:00:00 до 07:00:00), необходимо передать эти данные в запрос и получить по каждому дню информацию о показаниях счетчика за смену.

Как правильно в цикле передать эту информацию? Прошу подсказать.

Входные параметры строковые:
Код: plsql
1.
2.
d_start    in VARCHAR2,
d_end      in VARCHAR2



Код: plsql
1.
2.
3.
SELECT a.value
FROM table a
WHERE a.date between TO_DATE(d_start,'DD.MM.YYYY HH24:MI:SS') AND TO_DATE(d_end,'DD.MM.YYYY HH24:MI:SS')
...
Рейтинг: 0 / 0
SQL, написание цикла
    #39936273
Мимопроходящий
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а зачем тут цикл?

RTFM: EXTRACT(DAY FROM ..) + GROUP BY
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
SQL, написание цикла
    #39936311
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юлия0694,

Дельфи наверно тут не причём. Надо тему переносить в соответствующий SQL-раздел. И задачу описать поконкретнее. Мне кажется условий (в where) нужно два, по дате и по времени. А вот результат мне неясен. Что нужно? Сводка по дням, по часам? Если только по дням, то extract не нужен. Нужен group by по дате.
...
Рейтинг: 0 / 0
SQL, написание цикла
    #39936313
Фотография wadman
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI
Мне кажется условий (в where) нужно два, по дате и по времени.

По времени до полуночи и после. А лучше добавить рабочий календарь, учитывающий смены и тогда станет чуть проще и правильнее.

Модератор: Тема перенесена из форума "Delphi".
...
Рейтинг: 0 / 0
SQL, написание цикла
    #39936338
Фотография Akina
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
С учётом возможного перехода через полночь (смены могут быть как переходящие, так и не очень) с EXTRACT будет туговато. Можно брать разность в часах от момента начала самого первого интервала (в приведённом примере это будет 01.03.2020 23:00:00) и ориентироваться по остатку от деления на 24 (в приведённом примере он должен быть не больше 8). А группировать соответственно по результату целочисленного деления на те же 24.

Модератор: Тема перенесена из форума "Microsoft SQL Server".
...
Рейтинг: 0 / 0
SQL, написание цикла
    #39936361
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Тема пошла по форумам (smile).

Юлия0694, записи отобрать вот так:

Код: plsql
1.
2.
3.
select *
from statkit a
where a.dtim between '2020-03-01' and '2020-03-11' and ((cast(a.dtim as time) between '23:00:00' and '23:59:59') or (cast(a.dtim as time) between '00:00:00' and '06:59:59'))


Дальше нужно группировку сделать. Давайте больше инфы.
...
Рейтинг: 0 / 0
SQL, написание цикла
    #39936375
KreatorXXI
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
KreatorXXI,

вот так совсем круто:
Код: plsql
1.
2.
3.
4.
select iif(cast(a.dtim as time) between '00:00:00' and '06:59:59', cast(a.dtim as date)-1, cast(a.dtim as date)), sum(a.id_sotr)
from statkit a
where a.dtim between '2020-02-01' and '2020-02-29' and ((cast(a.dtim as time) between '23:00:00' and '23:59:59') or (cast(a.dtim as time) between '00:00:00' and '06:59:59'))
group by 1
...
Рейтинг: 0 / 0
SQL, написание цикла
    #39936381
Фотография Stax
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Юлия0694,

всегда 1смена
Код: plsql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
SQL> ed
Wrote file afiedt.buf

  1  with t(dat,value) as (
  2  select to_date('09.03.2020 23:00:00','DD.MM.YYYY HH24:MI:SS'), 10 value  from dual union all
  3  select to_date('10.03.2020 00:00:00','DD.MM.YYYY HH24:MI:SS'), 20 value  from dual union all
  4  select to_date('10.03.2020 01:00:00','DD.MM.YYYY HH24:MI:SS'), 30 value  from dual union all
  5  select to_date('10.03.2020 07:00:00','DD.MM.YYYY HH24:MI:SS'), 40 value  from dual union all
  6  select to_date('12.03.2020 07:00:00','DD.MM.YYYY HH24:MI:SS'), 1 value  from dual union all
  7  select to_date('13.03.2020 01:00:00','DD.MM.YYYY HH24:MI:SS'), 2 value  from dual)
  8  SELECT trunc(dat-1/24*7) d,sum(a.value) sv
  9  FROM t a
 10  WHERE
 11           a.dat-1/24*7 >=TO_DATE('09.03.2020','DD.MM.YYYY') and  to_char(a.dat-1/24*7,'hh24')>= (23-7)
 12  AND a.dat-1/24*7 < TO_DATE('13.03.2020','DD.MM.YYYY')+1
 13* group by trunc(dat-1/24*7)
SQL> /

D                  SV
---------- ----------
12.03.2020          2
09.03.2020         60



.....
stax
...
Рейтинг: 0 / 0
8 сообщений из 8, страница 1 из 1
Форумы / Oracle [игнор отключен] [закрыт для гостей] / SQL, написание цикла
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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