2011-12-28 23 views
23

Tôi đã cố gắng chuyển đổi dấu thời gian ("1985-02-07T00: 00: 00.000Z") thành ngày và tôi không thể thành công trong một số lần thử khác nhau của mình.Làm thế nào để chuyển đổi "1985-02-07T00: 00: 00.000Z" (ISO8601) thành một giá trị ngày tháng trong Oracle?

Dưới đây là các truy vấn Tôi đã thử:

select to_date('1985-02-07T00:00:00.000Z', 'YYYY-MM-DDTHH24:MI:SS.fffZ') 
from dual; 

gợi ý của bạn được đánh giá rất cao.

+2

+1 cho cố gắng thứ. Bạn có thể làm cho câu hỏi trở nên tốt hơn bằng cách bao gồm kết quả là gì và chúng đã sai hay những gì nói chung không hiệu quả. (Đã xảy ra lỗi? Có phải là một vài giờ không?) –

+2

Theo [to_date] (http://www.techonthenet.com/oracle/functions/to_date.php) Tôi tin rằng ít nhất "fff" là sai và phải là "FF3". Nhưng tôi không sử dụng/có Oracle :) –

Trả lời

37

to_date chuyển đổi đầu vào thành loại DATE không hỗ trợ số thập phân. Để sử dụng số giây phân số, bạn cần phải sử dụng loại TIMESTAMP được tạo khi sử dụng to_timestamp

nhận xét của pst về sửa đổi ff3 cũng chính xác.

giá trị "liên tục" trong mặt nạ dạng cần phải được kèm theo trong dấu nháy kép

Vì vậy, báo cáo kết quả cuối cùng là:

select to_timestamp('1985-02-07T00:00:00.000Z', 'YYYY-MM-DD"T"HH24:MI:SS.ff3"Z"') 
from dual; 
2

Một số rules to follow:

  1. Literals phải đôi được trích dẫn: MM dự kiến ​​một số tháng, "MM" dự kiến ​​một đôi M.
  2. Định dạng cho các giây phân số là FF, không phải F hoặc FFF. Bạn chỉ định số chữ số có số nguyên cuối, ví dụ: FF3.
  3. Tuy nhiên, ngày tháng không thể giữ số thập phân để bạn không thể sử dụng FF3 trong ngữ cảnh này.

này hoạt động:

SELECT TO_DATE('1985-02-07T00:00:00', 'YYYY-MM-DD"T"HH24:MI:SS') 
FROM dual; 

Tôi không biết nếu có một cách để bỏ qua giây phân đoạn trong TO_DATE() chức năng chuỗi thao tác vì vậy tôi đã sử dụng để lột chúng ra:

SELECT TO_DATE(SUBSTR('1985-02-07T00:00:00.000Z', 1, 19), 'YYYY-MM-DD"T"HH24:MI:SS') 
FROM dual; 
8
SQL> select cast(to_timestamp('1985-02-07T00:00:00.000Z', 'yyyy-mm-dd"T"hh24:mi:ss.ff3"Z"') as date) 
    2 from dual 
    3/

CAST(TO_TIMESTAMP(' 
------------------- 
07-02-1985 00:00:00 

1 row selected. 
2
SELECT to_timestamp_tz('2012-08-08T09:06:14.000-07:00','YYYY-MM-DD"T"HH24:MI:SS.FF3TZR') 
FROM dual; 

External table DDL, 
extract_date char(29) DATE_FORMAT timestamp WITH TIMEZONE mask 'YYYY-MM-DD"T"HH24:MI:SS.FF3TZR' 
+0

sử dụng tốt chức năng _tz. Tôi đã phải sử dụng điều này mặc dù: 'YYYY-MM-DD "T" HH24: MI: SS.FF3TZHTZM' – JoshC13

0

nếu bạn muốn nhận chuỗi ở định dạng ngày giờ sau đó thử này ....

select to_char(TO_DATE('2012-06-26T00:00:00.809Z', 'YYYY-MM-DD"T"HH24:MI:SS".""ZZZZ"'),'yyyy-MM-dd hh:mm:ss PM') as EVENT_DATE from dual 

EVENT_DATE 
----------------------- 
2012-06-26 12:06:00 AM 

chỉ dành cho ngày chỉ cần sử dụng ...

select TO_DATE('2012-01-06T00:00:00.809Z', 'YYYY-MM-DD"T"HH24:MI:SS".""ZZZZ"') from dual 
Các vấn đề liên quan