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)
sẽ trở lại
2007-09-22 15:07:00.000
2007-09-22 15:00:00.000
Phần trên chỉ cắt bớt giây và phút, tạo ra kết quả được yêu cầu trong câu hỏi. Như @OMG Ponies đã chỉ ra, nếu bạn muốn làm tròn lên / xuống, thì bạn có thể thêm nửa phút hoặc nửa giờ tương ứng, sau đó cắt bớt:
select dateadd(mi, datediff(mi, 0, dateadd(s, 30, @dt)), 0)
select dateadd(hour, datediff(hour, 0, dateadd(mi, 30, @dt)), 0)
và bạn sẽ nhận được:
2007-09-22 15:08:00.000
2007-09-22 15:00:00.000
Trước khi kiểu dữ liệu ngày tháng được thêm vào SQL Server 2008, tôi sẽ sử dụng phương pháp trên để cắt bớt phần thời gian khỏi ngày giờ để chỉ lấy ngày. Ý tưởng là xác định số ngày giữa ngày giờ được đề cập và một thời điểm cố định ( 0
, ngầm hiểu là 1900-01-01 00:00:00.000
):
declare @days int
set @days = datediff(day, 0, @dt)
và sau đó cộng số ngày đó vào thời điểm cố định, cung cấp cho bạn ngày ban đầu với thời gian được đặt thành 00:00:00.000
:
select dateadd(day, @days, 0)
hoặc ngắn gọn hơn:
select dateadd(day, datediff(day, 0, @dt), 0)
Sử dụng một datepart khác nhau (ví dụ hour
, mi
) sẽ làm việc cho phù hợp.