如何在MS SQL中将13位时间戳转换为指定日期时间格式
解决MS SQL中13位毫秒时间戳转指定日期格式的问题
我来帮你搞定这个转换需求——13位的时间戳本质是毫秒级的UNIX时间戳,MS SQL里处理它的关键是先把毫秒数转成datetime,再格式化你要的12小时制样式。
核心解决方案(SQL Server 2012及以上推荐)
直接用DATEADD转换时间戳为datetime,再用FORMAT函数生成你要的格式:
-- 测试单个时间戳 DECLARE @MsTimestamp BIGINT = 1525939481255; SELECT FORMAT( DATEADD(MILLISECOND, @MsTimestamp, '1970-01-01'), 'dd-MM-yyyy hh:mm:ss tt' ) AS FormattedDateTime;
执行后会输出:09-05-2018 03:44:41 PM(这个是UTC时间,如果需要本地时区,比如北京时间,记得加DATEADD(HOUR, 8, ...)调整偏移)
如果是直接处理表中的列,把变量换成你的字段名即可:
SELECT FORMAT( DATEADD(MILLISECOND, YourTimestampColumn, '1970-01-01'), 'dd-MM-yyyy hh:mm:ss tt' ) AS FormattedDateTime FROM YourTableName;
低版本SQL Server兼容方案(2012以下)
如果你的SQL Server版本不支持FORMAT函数,用CONVERT拼接的方式实现:
DECLARE @MsTimestamp BIGINT = 1525939481255; SELECT CONVERT(VARCHAR(10), dt, 105) -- 转成dd-MM-yyyy格式 + ' ' + SUBSTRING(CONVERT(VARCHAR(26), dt, 109), 13, 8) -- 提取hh:mm:ss部分 + RIGHT(CONVERT(VARCHAR(26), dt, 109), 2) -- 提取AM/PM标识 FROM ( SELECT DATEADD(MILLISECOND, @MsTimestamp, '1970-01-01') AS dt ) t;
关键细节说明
- 13位时间戳是从1970-01-01 00:00:00 UTC开始计算的毫秒数,所以必须用
DATEADD(MILLISECOND, ...)来转换,不能直接转成秒(会丢失精度)。 - 格式字符串里的
hh对应12小时制小时,tt对应AM/PM标识;如果不需要显示AM/PM,去掉tt即可。 - 注意时区问题:如果你的时间戳是UTC时间,但业务需要本地时间,记得在转换后加上对应的时区偏移(比如北京时间加8小时)。
内容的提问来源于stack exchange,提问作者Nikson
相关产品推荐
相关产品推荐

