Oracle
 sql >> Teknologi Basis Data >  >> RDS >> Oracle

Bagaimana Anda memilih bidang varchar2 dalam format 'HH24:MI:SSxFF6' sebagai INTERVAL HOUR TO SECOND(6)?

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.


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Mendapatkan Kesalahan - ORA-01858:karakter non-numerik ditemukan di tempat yang diharapkan berupa numerik

  2. Jenis atau nama namespace 'Oracle' tidak dapat ditemukan kesalahan

  3. PLS-00103 membuat tabel eksternal dengan SQL dinamis

  4. cara mengisi database menggunakan prosedur

  5. Konversikan gabungan luar warisan Oracle ke Ansi SQL