2013-08-15 8 views
5

Ich habe eine Oracle-Tabelle, die Transaktion und eine Datumsspalte speichern. Wenn ich Aufzeichnungen müssen für ein Jahr wählen sagen 2013 Ich mag dies tun:Wählen Sie Datensätze für ein bestimmtes Jahr Oracle

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

Aber ich brauche einen Geradliniger Weg von Datensätzen für ein Jahr die Auswahl sagen, dass die Parameter übergeben aus einer Anwendung ‚2013‘ Ergebnisse zu erhalten von Aufzeichnungen in diesem einen Jahr, ohne eine Reihe zu geben. Ist das möglich?

Antwort

5

Sie to_date Funktion

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') 

Lösung mit expliziten Vergleiche verwenden (tran_date> = ... und tran_date < ...) kann Verwenden Sie Index (en) auf trans_date Feld.

Denken Sie an Grenzen: z.B. Wenn tran_date = '31 .12.2013 18: 24: 45.155 'als Ihr Code "tran_date < = '31 -DEC-2013'" wird es vermissen

+0

Ich denke, du hast Recht. Ich habe diese tatsächlich mehrmals verpasst. – ErrorNotFoundException

13

Verwenden Sie die extract Funktion des Jahres ab dem Zeitpunkt zu ziehen:

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

Wenn 'tran_date' indiziert ist, würde dies die Verwendung von EXTRACT zwingen, einen Table Scan oder könnte Oracle diese in einen Bereich Suchvorgang übersetzen? * (Die äquivalenten Methoden in anderen SQL-Dialekten würden normalerweise einen Scan ergeben, was dazu führen könnte, dass er ineffizient ist.) * – MatBailie

+0

Danke Ich habe es auch mit DAY und MONTH versucht und herausgefunden, dass ich das Gleiche machen kann. – ErrorNotFoundException

+0

Bedeutet das, wenn das Datumsfeld indiziert ist, dann bin ich verloren? :) – ErrorNotFoundException

-2

--Jetzt Jahr in die gegebene eingeben: CAL_YEAR und Sie erhalten Ihre führte Termine für das Jahr

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; 
Verwandte Themen