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

TO_TIMESTAMP_TZ() Fungsi di Oracle

Di Oracle Database, TO_TIMESTAMP_TZ() fungsi mengubah argumennya menjadi nilai TIMESTAMP WITH TIME ZONE tipe data.

Sintaks

Sintaksnya seperti ini:

TO_TIMESTAMP_TZ(char [ DEFAULT return_value ON CONVERSION ERROR ]
  [, fmt [, 'nlsparam' ] ])

char argumen dapat berupa ekspresi apa pun yang dievaluasi ke string karakter CHAR , VARCHAR2 , NCHAR , atau NVARCHAR2 tipe data.

Opsi fmt argumen menentukan format char . Jika Anda menghilangkan fmt , lalu char harus dalam format default TIMESTAMP WITH TIME ZONE tipe data, yang ditentukan oleh NLS_TIMESTAMP_TZ_FORMAT parameter inisialisasi (lihat Cara Memeriksa Format Tanggal Sesi Oracle Anda).

'nlsparam' opsional argumen menentukan bahasa di mana nama bulan dan hari dan singkatan disediakan. Bentuknya sebagai berikut:

'NLS_DATE_LANGUAGE = language'

Contoh

Berikut adalah contoh dasar untuk ditunjukkan:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
    )
FROM DUAL;

Hasil:

25/AUG/30 06:10:35.123456789 PM +09:30

Format hasil ditentukan oleh NLS_TIMESTAMP_TZ_FORMAT sesi Anda parameter. Kami dapat memeriksa nilai NLS_TIMESTAMP_TZ_FORMAT parameter dengan menanyakan V$NLS_PARAMETERS lihat:

SELECT VALUE
FROM V$NLS_PARAMETERS
WHERE PARAMETER = 'NLS_TIMESTAMP_TZ_FORMAT';

Hasil:

DD/MON/RR HH12:MI:SSXFF AM TZR

Nilai default NLS_TIMESTAMP_TZ_FORMAT parameter berasal dari NLS_TERRITORY parameter. Dalam kasus saya NLS_TERRITORY parameternya adalah AUSTRALIA .

Inilah yang terjadi ketika saya mengubah NLS_TERRITORY parameter ke wilayah lain, lalu panggil TO_TIMESTAMP_TZ() lagi:

ALTER SESSION SET NLS_TERRITORY = 'AMERICA';
SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM'
    )
FROM DUAL;

Hasil:

25-AUG-30 06.10.35.123456789 PM +09:30

Kali ini hasilnya dikembalikan dalam format yang berbeda.

Anda juga dapat mengubah nilai NLS_TIMESTAMP_TZ_FORMAT parameter secara langsung. Ini akan mengubah parameter tersebut tanpa mempengaruhi parameter lainnya. Lihat Cara Mengubah Format Tanggal di Sesi Oracle Anda untuk informasi dan contoh lebih lanjut.

Format Default

Dalam contoh ini saya menghilangkan fmt argumen:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-AUG-30 06.10.35.123456789 PM +09:30'
    )
FROM DUAL;

Hasil:

25-AUG-30 06.10.35.123456789 PM +09:30

Saat melakukan ini, argumen harus dalam format default TIMESTAMP WITH TIME ZONE tipe data, yang ditentukan oleh NLS_TIMESTAMP_TZ_FORMAT parameter.

Berikut adalah contoh yang terjadi saat kami memberikan nilai yang tidak sesuai dengan format ini:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30'
    )
FROM DUAL;

Hasil:

Error report -
ORA-01849: hour must be between 1 and 12

Dalam hal ini, saya memberikan nilai yang menggunakan waktu 24 jam, tetapi NLS_TIMESTAMP_TZ_FORMAT saya parameter menentukan jam 12 jam dengan penunjuk AM/PM.

Untuk memperbaikinya, saya perlu mengubah input saya, atau mengubah nilai NLS_TIMESTAMP_TZ_FORMAT parameter.

Berikan Nilai Default pada Kesalahan Konversi

Anda juga memiliki opsi untuk memberikan nilai yang akan dikembalikan jika ada kesalahan saat mengonversi argumen ke TIMESTAMP WITH TIME ZONE ketik.

Contoh:

SET NULL 'null';
SELECT 
    TO_TIMESTAMP_TZ(
    'Oops!'
    DEFAULT null ON CONVERSION ERROR
    )
FROM DUAL;

Hasil:

null

Dalam hal ini saya menetapkan bahwa null harus dikembalikan setiap kali ada kesalahan konversi. Nilai yang dikembalikan dapat berupa ekspresi atau variabel pengikatan, dan harus dievaluasi ke string karakter CHAR , VARCHAR2 , NCHAR , atau NVARCHAR2 tipe data, atau null . Fungsi kemudian mengubahnya menjadi TIMESTAMP WITH TIME ZONE . Jika terjadi kesalahan selama konversi ini, maka kesalahan akan dikembalikan.

Mengenai baris pertama dalam contoh di atas, ini hanya untuk menentukan apa yang harus dikembalikan ke klien saya setiap kali null nilai terjadi. Secara default, SQLcl dan SQL*Plus mengembalikan ruang kosong setiap kali null terjadi sebagai akibat dari SQL SELECT penyataan.

Namun, Anda dapat menggunakan SET NULL untuk menentukan string berbeda yang akan dikembalikan. Di sini saya menetapkan bahwa string null harus dikembalikan.

'nlsparam' Argumen

'nlsparam' opsional argumen menentukan bahasa di mana nama bulan dan hari dan singkatan disediakan. Bentuknya sebagai berikut:

'NLS_DATE_LANGUAGE = language'

Contoh

SELECT 
    TO_TIMESTAMP_TZ(
        '25-agosto-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Hasil:

25-AUG-30 06.10.35.123456789 PM +02:00

Perhatikan bahwa hasilnya masih dikembalikan sesuai dengan NLS_TIMESTAMP_TZ_FORMAT sesi saat ini parameter. Hanya saja masukan dalam bahasa yang berbeda.

Inilah yang terjadi ketika saya mengubah agosto hingga August saat menggunakan 'nlsparam' yang sama nilai:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-August-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = SPANISH'
    )
FROM DUAL;

Hasil:

Error report -
ORA-01843: not a valid month

Ini terjadi karena saya tidak memberikan tanggal dalam bahasa yang ditentukan oleh 'nlsparam' argumen (Spanyol).

Mengubahnya menjadi English memecahkan masalah ini:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-August-2030 18:10:35.123456789 +02:00', 
        'DD-Month-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = English'
    )
FROM DUAL;

Hasil:

25-AUG-30 06.10.35.123456789 PM +02:00

Lihat Cara Mengembalikan Daftar Bahasa yang Didukung di Oracle jika itu membantu.

Argumen Null

Melewati null menghasilkan null :

SET NULL 'null';
SELECT 
    TO_TIMESTAMP_TZ(null)
FROM DUAL;

Hasil:

null

Jumlah Argumen Tidak Valid

Memanggil fungsi tanpa meneruskan argumen apa pun menghasilkan kesalahan:

SELECT TO_TIMESTAMP_TZ()
FROM DUAL;

Hasil:

Error report -
SQL Error: ORA-00938: not enough arguments for function
00938. 00000 -  "not enough arguments for function"

Namun, memberikan terlalu banyak argumen tampaknya tidak menimbulkan masalah, selama tiga yang pertama valid:

SELECT 
    TO_TIMESTAMP_TZ(
        '25-Aug-2030 18:10:35.123456789 +09:30', 
        'DD-Mon-RRRR HH24:MI:SS.FF TZH:TZM',
        'NLS_DATE_LANGUAGE = English',
        'Oops!',
        'Dang!',
        'Homer',
        'Symptom'
    )
FROM DUAL;

Hasil:

25-AUG-30 06.10.35.123456789 PM +09:30

  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Cara Membuat File login.sql untuk SQLcl

  2. Cara Mengembalikan Jumlah Detik Lewat Tengah Malam di Oracle Database

  3. Mekanisme yang Diikuti oleh Oracle saat kami mengambil cadangan panas

  4. Tidak dapat terhubung ke database Oracle menggunakan JDBC jika kata sandi memiliki karakter khusus

  5. Halaman beranda Oracle 10g express tidak muncul