2013-08-15 28 views
5

Tôi có bảng oracle lưu trữ giao dịch và cột ngày. Nếu tôi cần phải chọn hồ sơ trong vòng một năm nói 2013 tôi làm như thế này:Chọn bản ghi cho một năm nhất định Oracle

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

Nhưng tôi cần một cách thẳng về phía trước lựa chọn hồ sơ trong vòng một năm nói vượt qua Parameter '2013' từ một ứng dụng để có được kết quả từ các bản ghi trong một năm mà không đưa ra một phạm vi. Điều này có khả thi không?

Trả lời

5

Bạn có thể sử dụng to_date chức năng

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

giải pháp với sự so sánh rõ ràng (tran_date> = ... và tran_date < ...) có thể sử dụng (các) chỉ mục trên trường tran_date.

Suy nghĩ về biên giới: ví dụ: nếu tran_date = '31 .12.2013 18: 24: 45.155 'so với mã của bạn "tran_date < = '31 -DEC-2013'" sẽ bỏ lỡ nó

+0

Tôi nghĩ bạn đúng. Tôi đã thực sự bỏ lỡ những điều này nhiều lần. – ErrorNotFoundException

13

Sử dụng extract chức năng để kéo năm kể từ ngày:

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

Nếu 'tran_date' được lập chỉ mục, sử dụng này TRÍCH sẽ buộc một Quét Bảng, hoặc Oracle có thể dịch này vào một dãy tìm kiếm? * (Các phương thức tương đương trong các phương ngữ SQL khác thường mang lại một Scan, điều này có thể gây ra hiệu quả khủng khiếp.) * – MatBailie

+0

Cảm ơn tôi đã thử với DAY và MONTH và phát hiện ra tôi có thể làm điều tương tự. – ErrorNotFoundException

+0

Điều này có nghĩa là nếu trường Ngày được lập chỉ mục thì tôi có phải chịu số phận không? :) – ErrorNotFoundException

-2

--Chỉ cần đặt năm vào: CAL_YEAR và bạn sẽ nhận được kết quả ngày cho năm

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; 
Các vấn đề liên quan