Oracle
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Oracle

Làm cách nào để bạn chọn trường varchar2 ở định dạng 'HH24:MI:SSxFF6' làm GIỜ CAN THIỆP ĐẾN GIÂY (6)?

Bạn có thể sử dụng TO_DSINTERVAL chức năng ; ví dụ ở đây bằng cách sử dụng CTE để sao chép bảng của bạn:

WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
SELECT TO_DSINTERVAL('0 ' || time_field)
FROM some_table;

TO_DSINTERVAL('0'||TIME_FIELD)
---------------------------------------------------------------------------
+000000000 00:00:00.000000000

Lưu ý rằng để tạo định dạng mà hàm nhận dạng được, bạn phải cung cấp một phần 'ngày', do đó, phần trước của '0 ' giả chuỗi.

Truy vấn giá trị cố định của bạn trả về một định dạng hơi khác (hoặc ít nhất là hiển thị hơi khác một chút; loại daa khoảng thời gian không có mô hình định dạng theo cách khá giống với ngày tháng, vì vậy không chắc chắn làm thế nào để diễn đạt chính xác):

SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;

INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000

Để sao chép, bạn có thể cast cái này nếu bạn cần:

WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
SELECT CAST(TO_DSINTERVAL('0 ' || time_field) AS INTERVAL DAY TO SECOND(6))
FROM some_table;

CAST(TO_DSINTERVAL('0'||TIME_FIELD)ASINTERVALDAYTOSECOND(6))
---------------------------------------------------------------------------
+00 00:00:00.000000

... hoặc chỉ:

WITH some_table AS (SELECT '00:00:00.000000' AS time_field FROM dual)
SELECT CAST('0 ' || time_field AS INTERVAL DAY TO SECOND(6))
FROM some_table;

CAST('0'||TIME_FIELDASINTERVALDAYTOSECOND(6))
---------------------------------------------------------------------------
+00 00:00:00.000000

... đó là khá nhiều thứ mà @catcall đề xuất đầu tiên, nhưng điều này cũng cần '0 ' thêm vào trước hoặc bạn nhận được ORA-01867 . (Hoặc, nếu bạn cố gắng sử dụng HOUR TO SECOND , ORA-00963 , ngay cả với giá trị ngày được ghi trước). Tuy nhiên, tôi đoán (và đó chỉ là phỏng đoán, mặc dù rất ít hiểu biết) rằng nó đang thực hiện một TO_DSINTERVAL ngầm hiểu hoặc tương tự, và tôi nghĩ tôi muốn sử dụng một từ rõ ràng để tôi chắc chắn điều gì đang xảy ra. Tuy nhiên, đó có thể chỉ là tôi ...

Sử dụng dữ liệu mẫu của bạn, tôi cũng nhận được ORA-01867 , nhưng nó gây ra bởi giá trị null. Bạn có thể sử dụng case để trống trong kết quả:

SELECT CASE WHEN time_field IS NULL THEN null
    ELSE CAST('0 ' || time_field AS INTERVAL DAY TO SECOND(6)) END
FROM some_table;

CASEWHENTIME_FIELDISNULLTHENNULLELSECAST('0'||TIME_FIELDASINTERVALDAYTOSECO
---------------------------------------------------------------------------
+00 10:00:00.000000
+00 12:00:00.000000
+00 15:00:00.000000
+00 17:00:00.000000
+00 20:00:00.000000


6 rows selected.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. JDBC:lấy kiểu mảng từ siêu dữ liệu

  2. Xử lý ngoại lệ trong Thủ tục với các hàm lồng nhau trong pl / sql

  3. Cơ chế theo sau của Oracle khi chúng tôi sao lưu nóng

  4. Cách thiết lập Kiểm toán Oracle EBS

  5. Tại sao oracle không hiển thị phần nguyên của số thập phân