Anda dapat menggunakan TO_DSINTERVAL
fungsi
; contoh di sini menggunakan CTE untuk mereplikasi tabel Anda:
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
Perhatikan bahwa untuk membuat format menjadi sesuatu yang dikenali oleh fungsi, Anda harus menyediakan bagian 'hari', oleh karena itu awalan dari dummy '0 '
string.
Kueri nilai tetap Anda mengembalikan format yang sedikit berbeda (atau setidaknya menampilkan sedikit berbeda; tipe daa interval tidak memiliki model format dengan cara yang sama seperti tanggal, jadi tidak yakin bagaimana mengungkapkannya secara akurat):
SELECT INTERVAL '00:00:00.000000' HOUR TO SECOND(6)
FROM DUAL;
INTERVAL'00:00:00.000000'HOURTOSECOND(6)
---------------------------------------------------------------------------
+00 00:00:00.000000
Untuk menirunya, Anda dapat cast
ini jika Anda perlu:
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
... atau hanya:
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
... yang kira-kira seperti yang pertama kali disarankan oleh @catcall, tetapi ini juga membutuhkan '0 '
ditambahkan, atau Anda mendapatkan ORA-01867
. (Atau, jika Anda mencoba menggunakan HOUR TO SECOND
, ORA-00963
, bahkan dengan nilai hari yang ditambahkan sebelumnya). Namun, saya kira (dan itu hanya tebakan, meskipun sangat sedikit berpendidikan) bahwa itu melakukan TO_DSINTERVAL
implisit atau serupa, dan saya pikir saya lebih suka menggunakan yang eksplisit jadi saya yakin apa yang terjadi. Itu mungkin hanya aku...
Menggunakan data sampel Anda, saya juga mendapatkan ORA-01867
, tapi itu disebabkan oleh nilai nol. Anda dapat menggunakan case
untuk membiarkannya sebagai nol dalam hasil:
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.