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.