SQL Server如何将DateTime转换为仅保留日期和小时(分秒置0)
在SQL Server中截断DateTime到小时级别的方法
在SQL Server里要把DateTime值截断到小时级别(也就是把分、秒、毫秒都置为0),我给你分享几个常用且靠谱的方法,覆盖不同版本的需求:
方法1:DATEADD + DATEDIFF组合(通用所有SQL Server版本)
这是最经典也最通用的写法,不管你用的是老版本还是新版本都能正常工作,而且不受日期格式设置影响。
-- 处理当前时间GETDATE() SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, GETDATE()), 0) AS TruncatedToHour; -- 处理指定日期值 SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, '2020-01-01 12:45:50'), 0) AS TruncatedToHour;
简单解释下原理:DATEDIFF(HOUR, 0, 目标日期)会计算从SQL Server的默认基准时间(1900-01-01 00:00:00)到目标日期的总小时数,接着DATEADD把这个小时数加回基准时间,就自动把分、秒、毫秒都清零了,完美得到只保留日期和小时的结果。
方法2:字符串转换法(需注意日期格式)
这种方法是先把日期转成只包含日期和小时的字符串,再转回DateTime类型,不过要确保服务器的日期格式设置正确,不然可能出问题。
-- 处理当前时间 SELECT CAST(CONVERT(VARCHAR(13), GETDATE(), 120) + ':00:00' AS DATETIME) AS TruncatedToHour; -- 处理指定日期值 SELECT CAST(CONVERT(VARCHAR(13), '2020-01-01 12:45:50', 120) + ':00:00' AS DATETIME) AS TruncatedToHour;
这里CONVERT(VARCHAR(13), ..., 120)会把日期格式化为YYYY-MM-DD HH的形式,拼接:00:00后再转回DateTime,就得到了YYYY-MM-DD HH:00:00的结果。
方法3:DATE_TRUNC函数(SQL Server 2022及以上版本)
如果你用的是SQL Server 2022或更高版本,直接用DATE_TRUNC函数会更简洁直观,它专门用来截断日期到指定的精度级别。
-- 处理当前时间 SELECT DATE_TRUNC('HOUR', GETDATE()) AS TruncatedToHour; -- 处理指定日期值 SELECT DATE_TRUNC('HOUR', '2020-01-01 12:45:50') AS TruncatedToHour;
只需要指定截断到HOUR级别,函数会自动帮你把分、秒、毫秒都置为0,非常省心。
小提示:以上方法同样适用于
DateTime2类型,最终结果会是对应的DateTime2类型,分秒部分均为0。
内容的提问来源于stack exchange,提问作者Habeeb
相关产品推荐
相关产品推荐

