Отдельная дата PL / SQL для цикла

Я хочу использовать цикл for для даты в моей таблице, которая заботится только о годах и месяцах, а не о днях.

CURSOR ret_cur is SELECT orderdate FROM Orders WHERE status 
= 'DELAYED';
ret_rec ret_cur%ROWTYPE;

В настоящее время у меня есть

insert into Orders(OrderId, CustomerId, RetailerId, ProductId, Count, 
UnitPrice, OrderDate, Status) values (2,2,1,10,45,60, 
to_date('20180102','YYYYMMDD'),'DELIVERED');

этот тип данных в моей таблице заказов. (это пример формата) Я хочу использовать DISTINCT для перебора даты заказа на основе YYYY-MM. (День безразличия) Я попытался выбрать отдельный to_char (orderdate, 'YYYY-MM'), но, похоже, не работает.

например, если у меня 20180103, 20180104, 20180105, это должна быть одна итерация, поскольку у всех них одинаковые годы и месяцы.

Я не понимаю твоего вопроса. Курсор используется для итерации по набору результатов. Что вы хотите повторить? Вам вообще нужен курсор? Обычно они не нужны. Какой результат вы ищете?

Gordon Linoff 31.10.2018 11:54
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
0
1
123
3

Ответы 3

Выбрать дни без времени вы можете tunc(sysdate). В течение нескольких месяцев мы должны использовать для group by символьное значение:

select to_char(mydatecol,'yyyymm'), count(*) from
(
 select sysdate mydatecol from dual UNION ALL -- Fake-Table with some dates
 select sysdate - 1 mydatecol from dual UNION ALL
 select sysdate - 2 mydatecol from dual UNION ALL
 select sysdate - 3 mydatecol from dual UNION ALL
 select sysdate - 4 mydatecol from dual UNION ALL
 select sysdate - 30 mydatecol from dual UNION ALL
 select sysdate - 31 mydatecol from dual UNION ALL
 select sysdate - 32 mydatecol from dual UNION ALL
 select sysdate - 33 mydatecol from dual
)
group by to_char(mydatecol,'yyyymm')

Результат:

201809  3
201810  6

Вы также можете использовать trunc(date_col, 'mm'), который усекает дату до первого числа месяца. Это дает дополнительное преимущество в том, что не меняет тип данных результата (т.е. это была дата, это все еще дата).

Boneist 31.10.2018 09:27

Я думаю, вы хотели бы иметь такую ​​сортировку, как показано ниже:

with Orders
    (
     OrderId, CustomerId, RetailerId, ProductId, 
     Count, UnitPrice, OrderDate, Status
     ) as
(
  select 2,2,1,10,45,60, to_date('20180102','YYYYMMDD'),'DELIVERED' from dual
)
select o.* 
  from Orders o 
 where to_char(OrderDate,'yyyy-mm') 
     = to_char(to_date('&myDate','yyyymmdd'),'yyyy-mm');

    -- for "myDate" substitution variable use 20180103 or 20180104 or 20180105 .. etc.

Лучший способ выполнить такой запрос - усечь значение даты:

SELECT CustomerId, trunc(OrderDate,'MM') OrderMonth
     , sum(Count) totalCount
     , sum(Count*UnitPrice) totalPrice
  FROM Orders 
 GROUP BY CustomerId, trunc(OrderDate,'MM')

Например...

Другие вопросы по теме