2013-05-14 30 views
10

Các truy vấn sau đây:ngày chiết xuất chỉ từ timestamp đưa ra trong oracle sql

select cdate from rprt where cdate <= TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS') and ryg='R' and cnum='C002'; 

trở lại: 2013/04/27-10:06:26:794 như lưu trữ trong bảng.

Tôi chỉ muốn nhận ngày tháng là: 27-04-2013 và nhận được số ngày giữa ngày tdate resul và sysdate.

+0

CHỌN to_date (create_date, 'DD-MM-YYYY') sẽ phù hợp với bạn. Hãy thử nó – ankurtr

+0

'LRI tại dòng 1: ORA-01861: chữ không khớp với chuỗi định dạng ' trỏ tới cdate. – kumarprd

+0

xin lỗi. Vì bạn đã có ngày bạn cần phải chuyển đổi nó thành char. Vì vậy, hãy thử to_char (create_date, 'DD-MM-YYYY'). Nó sẽ làm việc cho bạn. – ankurtr

Trả lời

8

Đây chính xác là những gì TO_DATE() dành cho: để chuyển đổi dấu thời gian cho đến ngày.

Chỉ cần sử dụng TO_DATE(sysdate) thay vì TO_CHAR(sysdate, 'YYYY/MM/DD-HH24-MI-SS-SSSSS').

SQLFiddle demo

CẬP NHẬT:

mỗi cập nhật của bạn, cột cdate của bạn không phải là thực DATE hoặc TIMESTAMP loại, nhưng VARCHAR2. Bạn không nên sử dụng các loại chuỗi để giữ ngày tháng. Rất bất tiện và làm chậm để tìm kiếm, so sánh và thực hiện tất cả các loại toán học khác vào các ngày.

Bạn nên chuyển đổi trường cdateVARCHAR2 thành số TIMESTAMP thực. Giả sử không có người dùng khác cho lĩnh vực này ngoại trừ mã của bạn, bạn có thể chuyển đổi cdate để đánh dấu thời gian như sau:

BEGIN TRANSACTION; 
-- add new temp field tdate: 
ALTER TABLE mytable ADD tdate TIMESTAMP; 
-- save cdate to tdate while converting it: 
UPDATE mytable SET tdate = to_date(cdate, 'YYYY-MM-DD HH24:MI:SS'); 

-- you may want to check contents of tdate before next step!!! 

-- drop old field 
ALTER TABLE mytable DROP COLUMN cdate; 
-- rename tdate to cdate: 
ALTER TABLE mytable RENAME COLUMN tdate TO cdate; 
COMMIT; 

SQLFiddle Demo

+0

Nó ném lỗi: 'LRI tại dòng 1: ORA-01861: chữ không khớp với chuỗi định dạng ' – kumarprd

+0

Vâng, [SQLFiddle link] (http://www.sqlfiddle.com/#!4/d41d8/10899) hoạt động tốt cho 'sysdate'.Đưa cái gì? Bạn có chắc là bạn đang kể toàn bộ câu chuyện ở đây không? – mvp

+0

'CHỌN to_date (cdate, 'DD-MM-YYYY') từ rprt nơi cdate <= TO_DATE (sysdate, 'DD-MM-YYYY') và ryg = 'R' và cnum = 'C002';' cho tôi biết lỗi – kumarprd

1

thử loại định dạng:

SELECT to_char(sysdate,'dd-mm-rrrr') FROM dual 
1

Chuyển đổi Timestamp to Date như đã đề cập dưới đây, nó sẽ làm việc cho chắc chắn -

select TO_DATE(TO_CHAR(TO_TIMESTAMP ('2015-04-15 18:00:22.000', 'YYYY-MM-DD HH24:MI:SS.FF'),'MM/DD/YYYY HH24:MI:SS'),'MM/DD/YYYY HH24:MI:SS') dt from dual 
0

Định dạng này làm việc cho tôi, cho định dạng ngày nêu ví dụ MM/DD/YYYY

SELECT to_char(query_date,'MM/DD/YYYY') as query_date 
FROM QMS_INVOICE_TABLE; 
+1

Với điều này, bạn không có ngày tháng. Bạn đã là một Varchar2 –

0

Nếu bạn muốn giá trị từ cột dấu thời gian của mình trở lại làm kiểu dữ liệu ngày, hãy sử dụng như sau:

select trunc(my_timestamp_column,'dd') as my_date_column from my_table; 
Các vấn đề liên quan