MSSQL中如何将money类型时间与datetime类型日期合并
嘿,这个拆分存储日期时间的设计确实有点让人头疼,但咱们完全可以通过SQL把这两列合并成完整的datetime值。我给你两种常用的实现方法,你可以根据自己的场景选择:
方法一:字符串拼接转换(直观易懂)
这种方法先把Time列的数值拆分成时、分、秒,拼接成标准的时间字符串,再和Date列的日期部分合并:
SELECT Date, Time, -- 生成完整的日期时间 CAST(Date AS DATE) + CAST( -- 格式化小时为两位,不足补0 RIGHT('0' + CAST(FLOOR(Time) AS VARCHAR(2)), 2) + ':' + -- 格式化分钟为两位,不足补0 RIGHT('0' + CAST(FLOOR((Time - FLOOR(Time)) * 100) AS VARCHAR(2)), 2) + ':' + -- 格式化秒为两位,不足补0(处理小数部分的秒) RIGHT('0' + CAST(ROUND(((Time - FLOOR(Time)) * 100 - FLOOR((Time - FLOOR(Time)) * 100)) * 100, 0) AS VARCHAR(2)), 2) AS TIME) AS FullDatetime FROM YourTableName;
这里用FLOOR函数提取整数部分,RIGHT('0' + ..., 2)确保时、分、秒都是两位格式,避免出现5:3:2这种不标准的时间字符串导致转换失败。
方法二:DATEADD分步累加(性能更优)
如果你的数据量比较大,字符串转换可能会影响性能,推荐用DATEADD直接把时、分、秒加到Date列上:
SELECT Date, Time, DATEADD(SECOND, -- 计算秒数并取整 ROUND(((Time - FLOOR(Time)) * 100 - FLOOR((Time - FLOOR(Time)) * 100)) * 100, 0), DATEADD(MINUTE, -- 计算分钟数 FLOOR((Time - FLOOR(Time)) * 100), DATEADD(HOUR, -- 计算小时数 FLOOR(Time), Date) ) ) AS FullDatetime FROM YourTableName;
这个方法完全基于数值计算,避免了字符串转换的开销,适合大数据量的场景。
额外提示
- 如果你的
Time列只存储到分钟(比如示例中的10.35对应10:35:00),那秒的部分可以直接设为0,简化计算逻辑。 - 要确保
Time列的数值在合法时间范围内(0.0000到23.5959),否则可能生成无效的datetime值。
内容的提问来源于stack exchange,提问作者Fredulom
相关产品推荐
相关产品推荐

