Tôi hiện đang sử dụng biến thể dateadd / dateiff với ngày tháng không (0) cho việc này. Không cần truyền:
select dateadd(minute, datediff(minute,0,GETDATE()) / 15 * 15, 0)
GETDATE () là bất kể ngày giờ của bạn.
Điều này sẽ hoạt động cho các ngày ít nhất là đến năm 5500 trước khi ghi ngày bị lỗi do tràn. Tuy nhiên nếu bạn cố gắng sử dụng độ chính xác thứ hai, ở trên sẽ thất bại ngay lập tức.
Sử dụng một ngày cố định khác, như '2009-01-01' hoặc Ngày hôm nay (cảnh báo, SQL xấu hơn) sẽ khắc phục điều đó. Một ngày trong tương lai cũng sẽ hiệu quả. Miễn là nó có một phần thời gian là 00:00:00, bạn có thể căn cứ vào một ngày giờ khác.
ví dụ:làm tròn đến 30 giây gần nhất:
select dateadd(second, round(datediff(second, '2010-01-01', GETDATE()) / 30.0, 0) * 30, '2010-01-01');