Saya memiliki prosedur tersimpan yang memasukkan dua catatan ke dalam tabel, perbedaan antara catatan adalah bahwa kolom waktu dari catatan kedua adalah @MinToAdd
setelah yang pertama:
CREATE PROCEDURE CreateEntry
/*Other columns*/
@StartTime time(2),
@EndTime time(2),
@MinutesToAdd smallint
AS
BEGIN
SET NOCOUNT ON;
SET @MinutesToAdd = @MinutesToAdd % 1440; --Prevent overflow if needed?
IF (@MinutesToAdd > 0)
BEGIN
INSERT INTO ClientNotification (/*Other columns*/ startTime, endTime)
OUTPUT inserted.id
VALUES
(/*Other columns*/ @StartTime, @EndTime),
(/*Other columns*/ @StartTime + @MinutesToAdd, @EndTime + @MinutesToAdd);
END
ELSE
BEGIN
/*Whatever ELSE does.*/
END
END
Apa cara yang benar untuk menambahkan @MinutesToAdd
menit ke @StartTime
dan @EndTime
?
Harap dicatat saya menggunakan time
tipe data.
Pembaruan :
Jawaban yang benar harus berisi informasi berikut:
- Cara menambahkan menit ke
time
tipe data. - Bahwa solusi yang diusulkan tidak mengakibatkan hilangnya presisi.
- Masalah atau kekhawatiran yang harus diperhatikan jika risalah terlalu besar untuk dimasukkan ke dalam
time
variabel, atau risiko tergulingnyatime
variabel. Jika tidak ada masalah maka harap sebutkan.
sql-server
sql-server-2008
Berbilah
sumber
sumber
Jawaban:
Anda tidak dapat menggunakan aritmatika steno malas dengan tipe baru. Mencoba:
Perhatikan bahwa meskipun Anda telah melindungi
@MinutesToAdd
dari luapan, Anda belum melindungi hasilnya dari luapan. Ini tidak menghasilkan kesalahan, namun, mungkin bukan hasil yang Anda harapkan.Hasil:
Saya berasumsi ini harus melalui beberapa jenis konversi internal, karena Anda tidak bisa mendapatkan hasil itu dengan mengatakan:
Hasil:
Anda perlu mempertimbangkan bagaimana Anda ingin menangani perhitungan yang mengarah ke salah satu
@EndTime
atau keduanya@StartTime
dan@EndTime
berada di hari berikutnya.Juga - untuk memenuhi persyaratan baru lainnya dalam "jawaban ideal" Anda - tidak ada kehilangan presisi. Sesuai dokumentasi , jenis
DATEADD
pengembalian sama dengan input:Karena itu,
TIME
masuk,TIME
keluar.sumber
DATEADD
mengembalikan jenis yang sama dengan argumen tanggal maka saya akan menerimanya. "Cegah luapan jika perlu?" garis tidak diperlukan. Masalah roll over akan ditangani oleh sumber data dan tujuan data.Cukup gunakan fungsi dateadd untuk menambahkan menit Anda dalam bilangan bulat terhadap '0:00'. Lalu kembalikan ke waktu.
Pilih cast (dateadd (menit, 84, '0: 00') sebagai waktu)
Di sini, 84 adalah menit integer yang ingin saya ungkapkan dalam tipe "waktu".
Saya menambahkannya ke '0:00' dan kemudian untuk menghapus komponen tanggal, saya memasukkannya ke tipe waktu. Tidak perlu pengkodean khusus.
(Tidak ada nama kolom)
01: 00.00.0000000
sumber