在日期字段中从特定年份获取数据

问题描述

| 假设我有如下所示的数据
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到2009年12月31日。 我每年将如何获得收入? date1字段在oracle中为日期格式。我正在使用pl sql开发人员     

解决方法

只要date1没有时间成分,就可以使用:
where date1 between date \'2009-01-01\' and \'2009-12-31\'
可以在date1上使用索引。另一个解决方案(不能在date1上使用简单索引)是:
where trunc(date1,\'YYYY\') = date \'2009-01-01\'
    ,此查询对给定年份的AMT列求和。结果中是否包含YEAR是可选的;如果您不想要它,则也不需要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数据类型并包含一个时间元素(因此BETWEEN子句的AND臂中有其他格式)。如果DATE1操作不当,无法成为字符串,那么最简单的方法就是先将其设置为日期。     ,
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\',to_date(\'7/29/2008\',133200.00 AMOUNT from dual union all 
select 12111201   ACT_NO,to_date(\'5/19/2009\',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 \',\'DD-MON-YYYY HH24:MI:SS \')* /-来自@APC \的答案
group by extract(year from date1)
/

DATE1_YEAR             AMOUNT_SUMMED          DISTINCTACCOUNTS       TOTAL_OCCURRENCES      
---------------------- ---------------------- ---------------------- ---------------------- 
2008                   133200                 1                      1                      
2009                   199800                 1                      3   
您也可以使用extract(dateField中的year) 尽管除非要在函数上创建索引,否则使用@APC \或@Tony Andrews \是进行年度过滤的方法。