Получение данных за определенный год в поле даты

#sql #oracle

#sql #Oracle

Вопрос:

Предположим, у меня есть данные, как показано ниже

 ACT_NO     DATE1          AMOUNT
12111201   2/1/2009     66600.00
12111201   8/31/2009    66600.00
12111201   7/29/2008   133200.00
12111201   5/19/2009    66600.00
  

Мне нужно получить сумму за конкретный 2009 год, т.е. с 1/31/2009 по 31/12/2009.
Как я получу данные за год? Поле date1 находится в формате даты в oracle. Я использую pl sql developer

Ответ №1:

Пока у date1 нет компонента time, вы могли бы использовать:

 where date1 between date '2009-01-01' and '2009-12-31'
  

Это может использовать индекс для date1. Другим решением (которое не могло использовать простой индекс для date1) является:

 where trunc(date1,'YYYY') = date '2009-01-01'
  

Ответ №2:

Этот запрос суммирует столбец AMT за данный год. Включение ГОДА в результат необязательно; если вы этого не хотите, вам также не понадобится предложение GROUP BY.

 select to_char(date1, 'YYYY') as year
       , sum(amount) as year_total
from your_table
where date1 between to_date('01-JAN-2009', 'DD-MON-YYYY')
                and to_date('31-DEC-2009 23:59:59', 'DD-MON-YYYY HH24:MI:SS')
group by to_char(date1, 'YYYY')    
/
  

Запрос предполагает, что DATE1 имеет тип данных DATE и включает элемент time (отсюда дополнительное форматирование в AND arm предложения BETWEEN). Если DATE1 достаточно плохо обработан, чтобы быть строкой, самый простой способ — сначала преобразовать его в дату.

Комментарии:

1. TRUNC(date1,’YY’) является альтернативой TO_CHAR

Ответ №3:

 with sampleData as(
select 12111201   ACT_NO, to_date('2/1/2009' ,'mm/dd/rrrr') DATE1 ,    66600.00 AMOUNT from dual union all 
select 12111201   ACT_NO, to_date('8/31/2009','mm/dd/rrrr') DATE1 ,    66600.00 AMOUNT from dual union all 
select 12111201   ACT_NO, to_date('7/29/2008','mm/dd/rrrr') DATE1 ,   133200.00 AMOUNT from dual union all 
select 12111201   ACT_NO, to_date('5/19/2009','mm/dd/rrrr') DATE1 ,    66600.00 AMOUNT from dual 
)

select extract(year from date1) date1_year 
       ,sum(amount) amount_summed
       ,count(distinct ACT_NO) distinctAccounts
       , count(*) total_occurrences
  from sampleData
  

/*где date1 между to_date(’01-JAN-2009′, ‘DD-MON-YYYY’)
и to_date(’31-DEC-2009 23:59:59′, ‘ ДД-ПН-ГГГГ ЧЧ24:MI: SS’)*/ —из ответа @APC

 group by extract(year from date1)
/

DATE1_YEAR             AMOUNT_SUMMED          DISTINCTACCOUNTS       TOTAL_OCCURRENCES      
---------------------- ---------------------- ---------------------- ---------------------- 
2008                   133200                 1                      1                      
2009                   199800                 1                      3   
  

Вы также можете использовать извлечение(год из поля даты)

Хотя, если вы не хотите создавать индекс для функции, для фильтрации по году можно использовать @APC или @Tony Andrews’.