UTC时间戳(BigInt类型1538397000000)转CST时间求助
将BigInt毫秒级UTC时间戳转换为CST datetime
你的思路方向是对的——先把毫秒级时间戳转成秒,再基于Unix纪元时间计算,但还差一步时区转换:CST(中国标准时间)比UTC快8小时,所以需要在UTC时间基础上加上这个偏移量。我来帮你完善这个SQL语句,同时提供几种更稳妥的写法:
方法1:基于秒级转换+手动时区偏移
这是在你原有语句基础上调整的版本,逻辑清晰易懂:
SELECT DATEADD(HOUR, 8, DATEADD(SECOND, CONVERT(BigInt, 1538397000000/1000), '1970-01-01 00:00:00')) AS CST_Datetime;
- 第一步:
1538397000000/1000将毫秒级时间戳转为秒级(结果是1538397000) - 第二步:
DATEADD(SECOND, ..., '1970-01-01 00:00:00')得到UTC时间:2018-10-01 03:30:00 - 第三步:
DATEADD(HOUR, 8, ...)加上8小时偏移,最终得到CST时间:2018-10-01 11:30:00
方法2:直接处理毫秒级时间戳
如果时间戳包含非整秒的毫秒数,直接处理毫秒会更准确,避免截断误差:
SELECT DATEADD(HOUR, 8, DATEADD(MILLISECOND, 1538397000000, '1970-01-01 00:00:00')) AS CST_Datetime;
方法3:使用AT TIME ZONE(SQL Server 2016+)
如果你的SQL Server版本支持AT TIME ZONE(2016及以上),推荐用这种更标准的时区转换方式,无需手动计算偏移量(虽然中国现在没有夏令时,但这种写法更符合时区规范):
SELECT DATEADD(MILLISECOND, 1538397000000, '1970-01-01 00:00:00') AT TIME ZONE 'UTC' AT TIME ZONE 'China Standard Time' AS CST_Datetime;
这个语句会先把时间戳转换为UTC datetime,再自动转换为中国标准时间,结果和前两种方法一致。
执行以上任意语句,你都会得到对应的CST时间:2018-10-01 11:30:00。
内容的提问来源于stack exchange,提问作者stackuser
相关产品推荐
相关产品推荐

