我发现了以下
Select dateadd(minute, datediff(minute,0,GETDATE()) / 15 * 15, 0)
非常适合四舍五入到小时的最后四分之一。但是我总是希望得到最后一小时的最后一刻。
例如
如果时间是上午12:35,我想看上午11:45,因为那是该小时的最后一刻。
答案 0 :(得分:2)
您可以使用datetimefromparts()
:
select datetimefromparts(year(dt), month(dt), day(dt), datepart(hour, dt), 45, 0, 0)
from (values (dateadd(hour, -1, getdate()))) v(dt);
答案 1 :(得分:0)
这有点漫长,就像我的思维方式一样(戈登的思想比我的简洁得多):
DECLARE @time time = '12:35'
SELECT CONVERT(time,DATEADD(MINUTE,45,DATEADD(HOUR, DATEDIFF(HOUR,'00:00',DATEADD(MINUTE, -45, @time)),'00:00')));
答案 2 :(得分:0)
假设我理解了这个问题,您想获取当前分钟的当前小时在45到59之间,或者如果当前分钟在0到44之间,则要获取前一个小时-所以这是我建议的解决方案:
DECLARE @ActualTime DateTime = GetDate()
SELECT @ActualTime As ActualTime, DATETIMEFROMPARTS(YEAR(Now), MONTH(Now), DAY(Now), DATEPART(HOUR, Now), 45, 0, 0) As LastQuarterOfHour
FROM
(
SELECT IIF(DATEPART(MINUTE,@ActualTime) < 45, DATEADD(HOUR, -1, @ActualTime), @ActualTime) As Now
) AS x
答案 3 :(得分:0)
使用CASE
表达式扩展代码:
SELECT testdate
, DATEADD(MINUTE, DATEDIFF(HOUR, 0, testdate) * 60 - CASE WHEN DATEPART(MINUTE, testdate) < 45 THEN 15 ELSE 0 END, 0) AS clamped
FROM (VALUES
('2019-02-25 01:44:59'),
('2019-02-25 01:45:00')
) v(testdate)
-- testdate | clamped
-- 2019-02-25 01:44:59 | 2019-02-25 00:45:00.000
-- 2019-02-25 01:45:00 | 2019-02-25 01:00:00.000