Некоторые причины:
1) грамматика C++ более сложна, чем C# или Java и занимает больше времени для парсинга.
2) (более важный) компилятор C++ производит машинный код и делает всю оптимизацию во время компиляции. C# и Java идут всего половиной пути и оставляют эти шаги к JIT.
Использование to_char:
select to_char(sysdate, 'YYYY') from dual;
В вашем примере вы можете использовать что-то вроде:
BETWEEN trunc(sysdate, 'YEAR')
AND add_months(trunc(sysdate, 'YEAR'), 12)-1/24/60/60;
Значения для сравнения именно то, что вы просите:
select trunc(sysdate, 'YEAR') begin_year
, add_months(trunc(sysdate, 'YEAR'), 12)-1/24/60/60 last_second_year
from dual;
BEGIN_YEAR LAST_SECOND_YEAR
----------- ----------------
01/01/2009 31/12/2009
Другой вариант:
SELECT *
FROM TABLE
WHERE EXTRACT( YEAR FROM date_field) = EXTRACT(YEAR FROM sysdate)