Perangkap DATEADD dengan Integer Besar
Apabila bekerja dengan cap masa integer yang besar, fungsi DATEADD dalam SQL Server boleh menghadapi pengehadan. Artikel ini meneroka kes khusus di mana nilai integer yang besar menyebabkan ralat limpahan aritmetik.
Masalah
Pertimbangkan pernyataan SQL berikut, bertujuan untuk menukar cap waktu JavaScript yang besar kepada tarikh SQL:
DATEADD(MILLISECOND, cast(569337307200000 as bigint) % 1000, DATEADD(SECOND, cast(569337307200000 as bigint) / 1000, '19700101'))
Pada SQL Server 2008, melaksanakan pernyataan ini menghasilkan "Ralat limpahan aritmetik menukar ungkapan kepada int jenis data."
Penyelesaian
Kunci untuk mengatasi ralat ini terletak pada memecahkan operasi DATEADD kepada bahagian yang lebih kecil. Dengan menambahkan masa dalam unit yang lebih besar pada mulanya (cth., saat atau minit) dan kemudian menambahkan baki milisaat, kita boleh mengelakkan limpahan.
Sebagai contoh, penyataan berikut mengira masa mula diberi tempoh yang besar (dalam milisaat):
DATEADD(ms, -large_duration_ms%60000, DATEADD(minute, -large_duration_ms/60000, GETDATE()))
Contoh ini menolak minit daripada tempoh yang besar dahulu, kemudian menambah milisaat yang tinggal. Pendekatan ini memastikan pengiraan perantaraan tidak melimpah.
Atas ialah kandungan terperinci SQL Server DATEADD: Bagaimana untuk Mengelakkan Limpahan Aritmetik dengan Cap Masa Integer Besar?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!