SQL Server 2019无DATETRUNC时截断datetime(7)的替代方案
替代DATETRUNC的SQL Server 2019日期截断方案
在SQL Server 2019里,要实现不同精度的datetime(7)数据截断(年、月、日、小时、分钟、秒),用DATEADD+DATEDIFF的组合是最简洁的方案,直接返回日期类型,比拼接DATEPART生成字符串的方式更高效、更符合需求。针对各精度的具体写法如下:
截断到年
SELECT DATEADD(YEAR, DATEDIFF(YEAR, 0, YourDateTimeColumn), 0) AS TruncatedToYear FROM YourTable;原理:计算基准日期('1900-01-01',用0表示)到目标日期的年数,再将该年数加回基准日期,得到当年1月1日00:00:00的日期值。
截断到月
SELECT DATEADD(MONTH, DATEDIFF(MONTH, 0, YourDateTimeColumn), 0) AS TruncatedToMonth FROM YourTable;得到目标日期所在月份的1日00:00:00。
截断到日
SELECT DATEADD(DAY, DATEDIFF(DAY, 0, YourDateTimeColumn), 0) AS TruncatedToDay FROM YourTable;得到目标日期当天的00:00:00。
截断到小时
SELECT DATEADD(HOUR, DATEDIFF(HOUR, 0, YourDateTimeColumn), 0) AS TruncatedToHour FROM YourTable;截断掉分钟、秒及毫秒部分,保留到小时。
截断到分钟
SELECT DATEADD(MINUTE, DATEDIFF(MINUTE, 0, YourDateTimeColumn), 0) AS TruncatedToMinute FROM YourTable;截断掉秒及毫秒部分,保留到分钟。
截断到秒
SELECT DATEADD(SECOND, DATEDIFF(SECOND, 0, YourDateTimeColumn), 0) AS TruncatedToSecond FROM YourTable;截断掉毫秒部分,保留到秒级的datetime值。
这个方案的核心逻辑是通过DATEDIFF计算目标日期与基准日期之间的指定精度间隔数,再用DATEADD将该间隔数加回基准日期,从而实现截断效果。返回的结果是原生的datetime类型,无需额外类型转换,性能也比字符串拼接方式更优。
内容的提问来源于stack exchange,提问作者altink
相关产品推荐
相关产品推荐

