2013-08-15 18 views
5

Mam tabelę Oracle, która przechowuje transakcję i kolumnę z datą. Jeśli muszę wybrać rekordy na jeden rok mówią 2013 lubię to:Wybierz rekordy na określony rok Oracle

select * from sales_table 
where tran_date>='01-JAN-2013' 
and tran_date <='31-DEC-2013' 

Ale muszę prosta sposób wybierania rekordów przez rok mówią przekazać parametr „2013” ​​z poziomu aplikacji, aby uzyskać wyniki z zapisów w tym roku bez podawania zakresu. Czy to możliwe?

Odpowiedz

5

Można wykorzystać to_date funkcja

http://psoug.org/reference/date_func.html

select * 
    from sales_table 
where tran_date >= to_date('1.1.' || 2013, 'DD.MM.YYYY') and 
     tran_date < to_date('1.1.' || (2013 + 1), 'DD.MM.YYYY') 

rozwiązanie z jednoznacznych porównań (tran_date> = ... i tran_date < ...) jest w stanie użyj indeksu (-ów) w polu tran_date.

Pomyśl o granicach: np. if tran_date = '31 .12.2013 18: 24: 45.155 'niż twój kod "tran_date < = '31 -DEC-2013'" będzie tęsknić

+0

Myślę, że masz rację. Tak naprawdę kilka razy to przeoczyłem. – ErrorNotFoundException

13

Użyj funkcji extract ciągnąć rok od daty:

select * from sales_table 
where extract(YEAR from tran_date) = 2013 
+1

Jeśli 'tran_date' jest indeksowana, byłoby to stosowanie ekstraktu wymusić skanowanie tabeli, czy może to tłumaczyć Oracle do zakresu szukać? * (Równoważne metody w innych dialektach SQL normalnie przyniosłyby skanowanie, co może być w związku z tym strasznie nieefektywne.) * – MatBailie

+0

Dzięki temu próbowałem również z DAY i MONTH i odkryłem, że mogę zrobić to samo. – ErrorNotFoundException

+0

Czy to oznacza, że ​​jeśli pole daty jest indeksowane, to jestem skazany na zagładę? :) – ErrorNotFoundException

-2

--Jedno rokiem w podanym: CAL_YEAR i dostaniesz wynikał termin za rok

select daterange, dayname from 
( 
select (to_date(01||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(01||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(01||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(01||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(02||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(02||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(02||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(02||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(03||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(03||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(03||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(03||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(04||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(04||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(04||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(04||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(05||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(05||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(05||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(05||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(06||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(06||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(06||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(06||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(07||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(07||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(07||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(07||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(08||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(08||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(08||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(08||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(09||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(09||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(09||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(09||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(10||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(10||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(10||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(10||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(11||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(11||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(11||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(11||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31 
union 
select (to_date(12||' '||:CAL_YEAR,'MM YYYY')-1 + level) DateRange, 
TO_CHAR(to_date(12||' '||:CAL_YEAR,'MM YYYY')-1 + level,'DAY') DAYNAME 
from dual 
where (to_date(12||' '||:CAL_YEAR,'MM YYYY')-1+level) <= last_day(to_date(12||' '||:CAL_YEAR,'MM YYYY')) 
connect by level<=31) 
; 
-2
select last_name,hire_date 
from employees 
where extract(year from hire_date) = 2006; 
Powiązane problemy