Я хочу использовать цикл 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, это должна быть одна итерация, поскольку у всех них одинаковые годы и месяцы.
Выбрать дни без времени вы можете 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')
, который усекает дату до первого числа месяца. Это дает дополнительное преимущество в том, что не меняет тип данных результата (т.е. это была дата, это все еще дата).
Я думаю, вы хотели бы иметь такую сортировку, как показано ниже:
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')
Например...
Я не понимаю твоего вопроса. Курсор используется для итерации по набору результатов. Что вы хотите повторить? Вам вообще нужен курсор? Обычно они не нужны. Какой результат вы ищете?