首页 > 解决方案 > T-SQL 将时间(不是四舍五入)截断到最接近的分钟

问题描述

寻找最有效和最优雅的方式来将时间截断到分钟

-- I need to truncate the time to the minute, 
-- this code almost works but rounds up 
SELECT
    CAST('2021-09-02T15:15:30.9233333' AS datetime2(7)) AS EventDatetime2,
    CAST(CAST('2021-09-02T15:15:30.9233333' AS datetime2(7)) AS TIME(0)) AS EventTime

标签: sql-servertsql

解决方案


正如 Larnu 发布的那样,如果您想根据秒值向上或向下舍入,只需简单地转换为 smalldatetime 即可。

如果你想截断,有几种方法,最简单的可能只是将分钟添加到午夜(只发布因为我更喜欢没有像 1900-01-01 这样的神奇日期):

DECLARE @dt datetime2(7) = '2021-09-02T15:15:30.9233333';
DECLARE @d  datetime2(7) = CONVERT(date, @dt);

SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, @d, @dt), @d);

另一种方式更直观但有点难看:

DECLARE @dt datetime2(7) = '2021-09-02T15:15:30.9233333';

SELECT SMALLDATETIMEFROMPARTS
(
  DATEPART(YEAR,   @dt), 
  DATEPART(MONTH,  @dt), 
  DATEPART(DAY,    @dt), 
  DATEPART(HOUR,   @dt), 
  DATEPART(MINUTE, @dt)
);

推荐阅读