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

时间:2011-05-26 09:46:35

标签: 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年特定年份的金额总和,即2009年1月31日至2009年12月31日。 我将如何获得每年? date1字段在oracle中的日期格式。我正在使用pl sql developer

3 个答案:

答案 0 :(得分:1)

只要date1没有时间组件,您就可以使用:

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

可以在date1上使用索引。另一个解决方案(不能在date1上使用简单的索引)是:

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

答案 1 :(得分:1)

此查询汇总给定年份的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不足以成为一个字符串,那么最简单的方法就是将它首先用于约会。

答案 2 :(得分:0)

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','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(year from dateField)

虽然除非你想在这个函数上创建一个索引,但是利用@ APC或@Tony安德鲁斯是今年过滤的方法。