如何使用trim和len函数格式化SQL中time类型的Intime列值?
问题描述
表1:
| Name | Intime |
|---|---|
| Paulsmith | 15:10:45.0486392 |
我知道可以用trim和len函数移除Name列的末尾字符(去掉'smith'),只显示'Paul'。那怎么对Intime列的时间值做类似操作,只显示前8个字符(时分秒部分)?
我的尝试
先用字符串测试时能得到预期结果:
SELECT SUBSTRING('15:10:45.0486392',1,len('15:10:45.0486392')-8) AS Intime FROM stuattrecordAM
输出为"15:10:45",符合要求。
但换成列名执行时出错:
SELECT SUBSTRING(Intime,1,len(Intime)-8) AS Intime FROM stuattrecordAM
遇到的问题
使用Intime列名时触发错误:
Argument data type time is invalid for argument 1 of substring function.
(参数数据类型time对substring函数的参数1无效。)
解决方法
错误核心是Intime列是time数据类型,而SUBSTRING仅支持字符串类型,因此需要先转换类型,或用更适合的时间格式化方案:
方法1:转字符串后截取
将time类型转换为字符串,再截取前8位:
SELECT SUBSTRING(CAST(Intime AS VARCHAR(20)), 1, 8) AS Intime FROM stuattrecordAM
方法2:用时间格式化函数(更可靠)
如果是SQL Server环境,推荐用专门的时间格式化函数,避免字符串截取的潜在问题:
-- 返回字符串类型的hh:mm:ss格式 SELECT CONVERT(VARCHAR(8), Intime, 108) AS Intime FROM stuattrecordAM -- 返回无毫秒的time类型结果 SELECT CAST(Intime AS TIME(0)) AS Intime FROM stuattrecordAM
CONVERT的108格式专门对应hh:mm:ss的时间输出,比字符串截取更适配不同的时间格式场景。
内容的提问来源于stack exchange,提问作者Smith
相关产品推荐
相关产品推荐

