SQL中如何合并ReportedDate与ReportedTime列生成DATETIME类型值?
解决SQL合并日期与时间列的问题
你的问题出在对datetime类型直接使用字符串替换的逻辑上,导致合并操作未生效。以下是具体原因和可行的解决方案:
原语句失效原因
- 隐式转换格式不匹配:当你对
ReportedDate(datetime类型)使用REPLACE时,SQL会自动将其转换为字符串,但转换后的格式受服务器语言、日期设置影响,不一定是你预期的'YYYY-MM-DD 00:00:00.000'形式(比如可能是'Oct 4 2022 12:00AM'),这时候REPLACE找不到'00:00:00',自然无法替换。 - 类型转换逻辑错误:你将
ReportedTime转换为time类型后再参与字符串替换,类型不匹配导致替换逻辑失效,最终StartTime还是原日期值。
可行解决方案
方案1:字符串拼接(直观易读)
先提取ReportedDate的日期部分,拼接ReportedTime并补全秒数,再转换为datetime类型:
SELECT CONVERT(DATETIME, CONVERT(VARCHAR(10), ReportedDate, 120) + ' ' + ReportedTime + ':00') AS StartTime FROM EventDate
CONVERT(VARCHAR(10), ReportedDate, 120):将datetime转为'YYYY-MM-DD'格式的字符串- 拼接
ReportedTime + ':00':把char(5)的10:17补全为10:17:00的完整时间字符串 - 最终合并后转datetime得到目标结果
方案2:日期函数运算(更稳妥,避免格式问题)
利用日期加法直接合并日期和时间部分,无需字符串操作:
SELECT CAST(ReportedDate AS DATE) + CAST(ReportedTime + ':00' AS TIME) AS StartTime FROM EventDate
CAST(ReportedDate AS DATE):提取纯日期部分CAST(ReportedTime + ':00' AS TIME):将char(5)转为完整的time类型- 日期+时间的运算会自动转换为datetime类型
方案3:DATEADD函数兼容旧版本
如果你的SQL Server版本不支持日期+时间直接相加,可用DATEADD实现:
SELECT DATEADD(SECOND, DATEDIFF(SECOND, '00:00:00', CONVERT(TIME, ReportedTime + ':00')), ReportedDate) AS StartTime FROM EventDate
- 先计算
ReportedTime对应的秒数,再加到ReportedDate上,得到合并后的datetime
内容的提问来源于stack exchange,提问作者Connor W
相关产品推荐
相关产品推荐

