修改查询以返回今年的数据

时间:2019-07-16 08:06:52

标签: sql oracle

我有一个查询,该查询按tarifa计算策略。

select substr(tarifa,1,2), count(*)
from   pol p, uvod u, doppov d
where (datum_dop >='1-jan-12')  AND (datum_dop<='31-dec-12')
and izdavanje>='01-jul-07'
and p.orgjed = u.sorgz (+)
and DATUM_PREKIDA is not null
and p.polica=d.polica and d.pov_dopl='P'
and d.status='F'
and cisti_ao(p.polica)!=0 
group by substr(tarifa,1,2)

现在,我必须修改此查询以仅返回当前年份。

我尝试使用“提取”功能,但是它没有按我预期的那样工作。如何限制返回当年的数据?

更新

这是我到目前为止尝试的:

select substr(tarifa,1,2), count(*)
from   pol p, uvod u, doppov d
where  EXTRACT( YEAR FROM datum_dop) = EXTRACT(YEAR FROM sysdate) 
and izdavanje>='01-jul-07'
and p.orgjed = u.sorgz (+)
and DATUM_PREKIDA is not null
and p.polica=d.polica and d.pov_dopl='P'
and d.status='F'
and cisti_ao(p.polica)!=0 
group by substr(tarifa,1,2)

1 个答案:

答案 0 :(得分:4)

虽然可以使用:

where  EXTRACT( YEAR FROM datum_dop) = EXTRACT(YEAR FROM sysdate) 

这将防止考虑对datum_pop的索引-尽管如果您要访问很大一部分数据,则可能无法使用该索引。即便如此,另一种方法是使用范围:

where  datum_dop >= TRUNC(sysdate, 'YYYY') 
and    datum_pop < ADD_MONTHS(TRUNC(sysdate, 'YYYY'), 12)

TRUNC(sysdate, 'YYYY')使您在当年第一天的午夜; ADD_MONTHS(..., 12)在明年第一天的午夜给您。

您甚至可能不需要第二个条件-这取决于datum_pop是否可以有将来的日期,即超过sysdate的日期。


不直接相关,但

and izdavanje>='01-jul-07'

在当前会话中可能为您工作,但是它依赖于将字符串值隐式转换为日期,并且另一个具有不同NLS设置的用户可能会看到错误的结果或错误。您可以使用显式转换:

and izdavanje>=TO_DATE('01-jul-07', 'DD-Mon-RR', 'NLS_DATE_LANGUAGE=ENGLISH')

或不依赖于该语言的格式:

and izdavanje>=TO_DATE('2007-07-01', 'YYYY-MM-DD')

或带有日期文字(如果8i支持的话):

and izdavanje>=DATE '2007-07-01'