2010-02-26 66 views
10

Chúng tôi có một bảng có cột NGÀY d.Oracle: So sánh ngày chỉ theo Giờ

Tôi muốn nhận tất cả các hàng có cột d lớn hơn/thấp hơn một số giá trị, bất kể ngày tháng.

Ví dụ

|  d   | 
------------------- 
|2009/11/1 15:55:23| 
-------------------- 
|2009/11/2 15:55:23| 
-------------------- 
|2009/11/3 15:55:23| 
-------------------- 
|2009/11/3 17:55:23| 
-------------------- 

Ví dụ, Nếu tôi muốn tất cả các hồ sơ được đánh dấu sau 05:00:

select d 
from my_table 
where extract(hour from d) > TO_DATE ('17:00:00','HH24:MI:SS') 

này sẽ trả về chỉ có một kỷ lục

|2009/11/3 17:55:23| 

I don' t biết nếu đây là cách tốt nhất để làm điều đó, nhưng tôi nhận được một lỗi trên chức năng trích xuất:

ORA-30076: invalid extract field for extract source 
Cause: The extract source does not contain the specified extract field. 

Có cách nào tốt hơn để thực hiện việc này không? Có vấn đề gì với lỗi đó? trích xuất chỉ có sẵn cho sysdate, như trong tất cả các ví dụ tôi đã tìm thấy?

Cảm ơn trước

+0

Bạn đã tìm ra giải pháp chung, làm việc với trường HOUR và EXTRACT chưa? Tôi cần một giải pháp tương thích DBMS qua cho việc này. –

Trả lời

12

Làm thế nào về điều này?

select d 
from my_table 
where to_char(d,'HH24') > '16'; 
+0

Nhân tiện, 'giờ' chỉ được hỗ trợ cho loại dấu thời gian dựa trên tìm kiếm của google. Có phải vấn đề về hiệu suất trong trường hợp này không? Chỉ tò mò thôi. – exiter2000

+0

Có, hiệu suất là một vấn đề – Tom

+2

Hãy xem xét một chỉ số dựa trên hàm trên biểu thức bên trên: 'CREATE INDEX my_table_fbi01 trên my_table (to_char (date_col, 'HH24'));' Tuy nhiên, với ví dụ của bạn, hiệu suất có thể vẫn chưa tối ưu. Giả sử không có sự khác biệt trong mẫu theo giờ của cột ngày của bạn, bạn vẫn sẽ nhận được 1/3 dữ liệu trở lại, do đó, chỉ mục sẽ không giúp bạn ở đó. –

4

Hãy thử điều này:

select d from my_table 
where (d-trunc(d)) > 16/24; 
7

Không có một cơ sở dữ liệu Oracle để kiểm tra với tại thời điểm này nhưng tôi nghĩ rằng sau đây nên làm việc:

SELECT * 
    FROM MY_TABLE t 
    WHERE EXTRACT(HOUR FROM CAST(t.D AS TIMESTAMP)) > 16; 

Nhưng tôi không hiểu tại sao các CAST sẽ là cần thiết như this page nói HOUR đó là trường hợp lệ trong DATE.

Chia sẻ và thưởng thức.

+1

[Trang] này (http://docs.oracle.com/cd/B28359_01/server.111/b28286/functions052.htm) giải thích lý do tại sao bạn cần truyền tới TIMESTAMP: _ "EXTRACT diễn giải expr dưới dạng kiểu dữ liệu datetime ANSI. Ví dụ, EXTRACT xử lý DATE không phải là phiên bản cũ của Oracle DATE mà là ANSI DATE, không có phần tử thời gian. "_ –