将SQL表中Decimal格式存储的Excel日期转换回日期格式
解决Excel日期序列号转SQL datetime的问题
错误原因
你之前用的convert(datetime, '45014.75', 103)写法不对——103样式是用来解析dd/mm/yyyy格式的日期字符串的,而45014.75是Excel的日期序列号(本质是浮点数,代表从1900-01-00开始的天数+时间占比),不是日期字符串,所以转换会报错。
正确转换方法
情况1:SQL表中存储的是数值类型(float/decimal)
直接用DATEADD函数计算,把序列号作为天数加到Excel的起始日期1900-01-00上:
SELECT DATEADD(day, 45014.75, '1900-01-00') AS ConvertedDate1, -- 输出:2023-03-29 18:00:00.000 DATEADD(day, 45216.3958333333, '1900-01-00') AS ConvertedDate2 -- 输出:2023-10-17 09:30:00.000
情况2:SQL表中存储的是字符串类型
先把字符串转成浮点数,再用DATEADD:
SELECT DATEADD(day, CAST('45014.75' AS float), '1900-01-00') AS ConvertedDate1, DATEADD(day, CAST('45216.3958333333' AS float), '1900-01-00') AS ConvertedDate2
补充说明
- Excel日期序列号的整数部分是从1900-01-00开始的天数,小数部分是一天内的时间占比(比如0.75=18:00,0.3958333333≈09:30)
- 若遇到小于60的序列号,要注意Excel的1900闰年bug(Excel错误认为1900年是闰年),需额外减1天,但你的数值远大于60,无需处理。
内容的提问来源于stack exchange,提问作者Philip
相关产品推荐
相关产品推荐

