如何在SQL Server中从指定格式字符串提取日、时、分字段
提取Duration列中的日、时、分字段
你的原始语句问题在于,LEFT(StageDuration, CHARINDEX('day', Duration) - 1)会取出day前面的所有内容(比如minute45hour1),而不是我们需要的数字部分。下面是针对SQL Server的正确写法,可以分别提取出day、hour、minutes字段:
完整SQL语句
SELECT -- 提取day字段:取'day'之后的所有数字 CAST(SUBSTRING(Duration, CHARINDEX('day', Duration) + 3, LEN(Duration)) AS INT) AS day, -- 提取hour字段:取'hour'之后到'day'之前的数字 CAST(SUBSTRING(Duration, CHARINDEX('hour', Duration) + 4, CHARINDEX('day', Duration) - CHARINDEX('hour', Duration) - 4) AS INT) AS hour, -- 提取minutes字段:取'minute'之后到'hour'之前的数字 CAST(SUBSTRING(Duration, CHARINDEX('minute', Duration) + 6, CHARINDEX('hour', Duration) - CHARINDEX('minute', Duration) - 6) AS INT) AS minutes FROM 你的表名;
语句说明
- minutes提取:先定位
minute的位置,加上6(minute的字符长度)就是数字起始位,结束位是hour的位置减去起始位的长度,最后转成整数类型。 - hour提取:同理,定位
hour的位置加4(hour的字符长度)作为起始位,结束位是day的位置减去起始位的长度。 - day提取:定位
day的位置加3(day的字符长度),从这里开始到字符串末尾的内容就是day的数字,转成整数即可。
测试你的示例数据,这个语句会输出你预期的结果:
| day | hour | minutes |
|---|---|---|
| 0 | 1 | 45 |
| 2 | 10 | 8 |
| 11 | 2 | 15 |
内容的提问来源于stack exchange,提问作者Guissous Allaeddine
相关产品推荐
相关产品推荐

