Mengendalikan Ralat Limpahan Aritmetik dengan DATEADD dan Bigints
Fungsi DATEADD dalam SQL Server ialah alat yang berkuasa untuk memanipulasi tarikh dan masa. Walau bagaimanapun, ia boleh menghadapi ralat limpahan aritmetik apabila bekerja dengan integer besar.
Masalah:
Seorang pengguna cuba menukar tarikh JavaScript kepada tarikh SQL menggunakan pertanyaan berikut :
DATEADD(MILLISECOND, cast(569337307200000 as bigint) % 1000, DATEADD(SECOND, cast(569337307200000 as bigint) / 1000, '19700101'))
Walau bagaimanapun, ia mengakibatkan satu pengecualian:
Arithmetic overflow error converting expression to data type int
Penyelesaian:
Untuk mengelakkan ralat limpahan, adalah disyorkan untuk memecahkan operasi DATEADD kepada langkah yang lebih kecil, menggunakan unit masa yang lebih kasar seperti saat atau minit sebagai titik permulaan. Ini membolehkan sistem mengendalikan pengiraan kalendar dengan lebih cekap.
Sebagai contoh, pertanyaan berikut akan mengira masa mula daripada tempoh milisaat:
-- Avoid using weeks or months due to calendar irregularities DATEADD(ms, -large_duration_ms%60000, DATEADD(minute, -large_duration_ms/60000, GETDATE()))
Pendekatan ini memastikan operasi aritmetik adalah dilakukan dalam had jenis data integer, menghalang ralat limpahan.
Atas ialah kandungan terperinci Bagaimana untuk Mengelakkan Ralat Limpahan Aritmetik Apabila Menggunakan DATEADD dengan Bigints dalam SQL Server?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!