declare @dt datetime
set @dt = '09-22-2007 15:07:38.850'
select dateadd(mi, datediff(mi, 0, @dt), 0)
select dateadd(hour, datediff(hour, 0, @dt), 0)
akan kembali
2007-09-22 15:07:00.000
2007-09-22 15:00:00.000
Di atas hanya memotong detik dan menit, menghasilkan hasil yang diminta dalam pertanyaan. Seperti yang ditunjukkan oleh @OMG Ponies, jika Anda ingin membulatkan ke atas/bawah, maka Anda dapat menambahkan masing-masing setengah menit atau setengah jam, lalu potong:
select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)
dan Anda akan mendapatkan:
2007-09-22 15:08:00.000
2007-09-22 15:00:00.000
Sebelum tipe data tanggal ditambahkan di SQL Server 2008, saya akan menggunakan metode di atas untuk memotong bagian waktu dari datetime untuk mendapatkan hanya tanggal. Idenya adalah untuk menentukan jumlah hari antara datetime yang dimaksud dan titik waktu tertentu (0
, yang secara implisit dilemparkan ke 1900-01-01 00:00:00.000
):
declare @days int
set @days = datediff(day, 0, @dt)
lalu tambahkan jumlah hari tersebut ke titik waktu tetap, yang memberi Anda tanggal asli dengan waktu yang disetel ke 00:00:00.000
:
select dateadd(day, @days, 0)
atau lebih ringkasnya:
select dateadd(day, datediff(day, 0, @dt), 0)
Menggunakan bagian tanggal yang berbeda (mis. hour
, mi
) akan berfungsi sebagaimana mestinya.