我有一个查询,该查询按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)
答案 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'