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 @OMG Ponies, jika Anda ingin membulatkan ke atas / ke 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 hanya mendapatkan tanggal. Idenya adalah untuk menentukan jumlah hari antara tanggal waktu yang dimaksud dan titik waktu tetap ( 0
, yang secara implisit ditransmisikan 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 singkatnya:
select dateadd(day, datediff(day, 0, @dt), 0)
Menggunakan bagian data yang berbeda (mis. hour
, mi
) Akan bekerja sesuai dengan itu.