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

ORA-01873:presisi terdepan

Salah satu nomor 'Epoch' numerik Anda tampaknya terlalu besar (atau terlalu kecil) untuk numtodsinterval() berfungsi untuk menangani. Nilai terbesar yang dapat Anda lewati karena jumlah detik adalah 2^31-1:

SQL> select numtodsinterval(power(2,31) - 1, 'SECOND') as interval from dual; 

INTERVAL     
--------------
24855 3:14:7.0

SQL> select numtodsinterval(power(2,31), 'SECOND') as interval from dual; 

SQL Error: ORA-01873: the leading precision of the interval is too small
01873. 00000 -  "the leading precision of the interval is too small"
*Cause:    The leading precision of the interval is too small to store the
           specified interval.
*Action:   Increase the leading precision of the interval or specify an
           interval with a smaller leading precision.

Sebagai zaman bahwa jumlah detik tertinggi yang diizinkan mewakili 2038-01-19 03:14:07. Ini masalah tahun 2038 , pada dasarnya.

Anda bisa sampai di sana dengan angka negatif juga:

SQL> select numtodsinterval(-2208988800, 'SECOND') as interval from dual;

SQL Error: ORA-01873: the leading precision of the interval is too small

Menggunakan -power(2, 31) membungkus ke nilai positif, tetapi kesalahan yang lebih rendah dari itu:

SQL> select numtodsinterval(power(2,31) - 1, 'SECOND') as interval from dual;

INTERVAL     
--------------
24855 3:14:7.0

SQL> select numtodsinterval(-power(2,31), 'SECOND') as interval from dual;

INTERVAL     
--------------
24855 3:14:8.0

SQL> select numtodsinterval(-power(2,31) - 1, 'SECOND') as interval from dual;

SQL Error: ORA-01873: the leading precision of the interval is too small

Anda membagi dengan 1000, jadi salah satu kolom Anda F ke K memiliki nilai yang melebihi 2147483647000. Itu seharusnya cukup mudah ditemukan, dan Anda mungkin ingin mempertimbangkan untuk menambahkan batasan centang ke kolom tersebut sehingga tidak dapat disetel juga tinggi - periksa apakah nilai kolom kurang dari atau sama dengan 1000 * (power(2, 31) - 1) . Dan lebih besar dari nol, atau lebih besar dari-1000 * (power(2, 31) juga.

Alasan tidak error ketika Anda memiliki filter seperti where Col1 = 123 adalah bahwa filter (predikat) Anda didorong ke atas ke kueri tampilan dan baris dengan nilai yang terlalu tinggi tidak dievaluasi. Mungkin Anda hanya memiliki satu nilai seperti itu, dan col1 nilainya tidak 123 dan col2 nilainya tidak 'xyz'. Jika Anda mengidentifikasi baris masalah dan memfilternya menggunakan col1 yang sebenarnya nilai itu masih akan error. Tanpa filter, evaluasi dilakukan untuk semua baris.

Angka negatif spesifik yang Anda miliki tampaknya merupakan angka ajaib:

SQL> select date '1970-01-01' - 2208988800/86400 from dual;

DATE'1970-01-01'-2208988800/86400
---------------------------------
1900-01-01 00:00:00              

Jika Anda ingin mengecualikannya, Anda harus mengubah definisi tampilan untuk menambahkan filter, mis:

...
AND tab2.colh > 0

atau ubah ekspresi kolom untuk menanganinya, baik mengabaikannya dan membiarkannya nol, atau mungkin lebih berguna mengembalikan tanggal ajaib itu:

    TO_CHAR(CASE WHEN tab2.colh = -2208988800000 THEN DATE'1900-01-01'
      ELSE DATE'1970-01-01' + NUMTODSINTERVAL( tab2.colh / 1000,'SECOND')
      END, 'YYYY/MM/DD HH24:MI:SS') AS Col13,

Anda juga dapat mengubah dari menggunakan interval menjadi menggunakan aritmatika tanggal:

    TO_CHAR(DATE'1970-01-01' + ( tab2.colh / 86400000 ), 'YYYY/MM/DD HH24:MI:SS') AS Col13,

Anda harus mengubah definisi tampilan daripada kueri Anda, kecuali colh disertakan dalam daftar pilih (yang tampaknya tidak demikian), dan meskipun demikian, Anda hanya dapat mengecualikannya - dan itu mungkin masih tidak selalu menghindari kesalahan, bergantung pada cara pengoptimal menangani kueri.




  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 mengetahui / mengambil nama pengguna Windows di Oracle APEX

  2. Oracle ROWID sebagai parameter fungsi/prosedur

  3. Mengembalikan 1 atau 0 dalam kueri SQL tertentu

  4. Pro dan kontra menggunakan paket di Oracle

  5. sql - masukkan jika tidak ada