SQL Server中如何将儒略日的时分秒部分转为常规日期时间?
解决SQL Server中儒略日期时间(含时分秒)的转换问题
嘿,刚好我之前处理过类似的儒略日期转换需求,你已经搞定了日期部分,咱们把时分秒的逻辑整合进去就完美了!
首先得明白:儒略日期的小数部分其实是一天的比例——比如0.05929天,就是把一天24小时拆成100000份,取其中5929份对应的时分秒。
方法一:拆分整数+小数部分(清晰易懂)
先提取儒略日的整数部分处理日期,再把小数部分转换成秒数加到日期上:
DECLARE @JulianDateTime AS FLOAT = 2458228.05929; SELECT @JulianDateTime AS 原始儒略日期时间, -- 先转日期部分,再加上小数部分对应的秒数 DATEADD(SECOND, (@JulianDateTime - FLOOR(@JulianDateTime)) * 86400, -- 小数部分×一天的总秒数(24×60×60) DATEADD(DAY, FLOOR(@JulianDateTime) - 2440588, '1970-01-01') ) AS UTC格式时间, -- 如果需要转成IST时区(比UTC快5小时30分=330分钟) DATEADD(MINUTE, 330, DATEADD(SECOND, (@JulianDateTime - FLOOR(@JulianDateTime)) * 86400, DATEADD(DAY, FLOOR(@JulianDateTime) - 2440588, '1970-01-01') ) ) AS IST格式时间;
方法二:更简洁的写法(利用DATEADD的浮点数支持)
其实SQL Server的DATEADD函数对DAY参数支持浮点数,直接代入完整的儒略日期就能自动处理时分秒,不用拆分:
DECLARE @JulianDateTime AS FLOAT = 2458228.05929; SELECT @JulianDateTime AS 原始儒略日期时间, DATEADD(DAY, @JulianDateTime - 2440588, '1970-01-01') AS UTC格式时间, DATEADD(MINUTE, 330, DATEADD(DAY, @JulianDateTime - 2440588, '1970-01-01')) AS IST格式时间;
应用到表中的列
如果是要批量转换表中的TimeUpdated列,直接把变量换成列名即可:
SELECT TimeUpdated AS 原始儒略日期时间, DATEADD(DAY, TimeUpdated - 2440588, '1970-01-01') AS UTC格式时间, DATEADD(MINUTE, 330, DATEADD(DAY, TimeUpdated - 2440588, '1970-01-01')) AS IST格式时间 FROM YourTableName; -- 替换成你的表名
验证你的例子
用你给的儒略日2458228.05929测试,转换后的UTC时间是2018-04-19 13:25:20左右,加上330分钟(5.5小时)后就是IST的2018-04-19 18:55:20,和你给出的结果完全匹配!
内容的提问来源于stack exchange,提问作者Be1ng_Kr1Sh
相关产品推荐
相关产品推荐

