【问题标题】:Split value by delimeter SQL通过分隔符 SQL 拆分值
【发布时间】:2021-06-14 16:53:03
【问题描述】:

我有一个列 (varchar),其值显示为 44:45:00。我正在编写一个查询,我想将 44:00:00 转换为十进制数并希望使用以下计算

((44(part1) * 60) + 45(part2) ) / 60 = 44,75

结果应该作为一个值返回,它不应该创建一个新列。

sql database

【问题讨论】:

  • 为什么用jquery标记? o.O
  • @Andreas 我相信很多人将 jquery 误认为是查询标签。
  • @CarstenLøvboAndersen 但是怎么做呢? "jQuery 是一个 JavaScript 库,..." :/
  • 请说明您使用的是哪个 dbms 版本。

标签: sql text decimal delimiter


【解决方案1】:

请使用这个:

架构:

create table x(t_hours varchar(20));
insert into x values('1:00:00');
insert into x values('1:00:00');
insert into x values('64:00:00');
insert into x values('2:00:00');
insert into x values('2:00:00');
insert into x values('1:30:00');
insert into x values('110:40:12');
insert into x values('44:38:24');
insert into x values('14:00:00');
insert into x values('8:00:00');
insert into x values('8:00:00');
insert into x values('47:00:00');
insert into x values('16:00:00');
insert into x values('1:00:00');
insert into x values('8:00:00');
insert into x values('16:00:00');
insert into x values('1:33:36');
insert into x values('19:46:48');
insert into x values('2:00:00');
insert into x values('2:00:00');
insert into x values('8:00:00');
insert into x values('8:00:00');
insert into x values('4:30:00');
insert into x values('6:30:00');
insert into x values('0:15:00');
insert into x values('1:00:00');
insert into x values('32:00:00');
insert into x values('8:00:00');
insert into x values('17:00:00');

查询:

select t_hours,left(t_hours,charindex(':',t_hours)-1)+ left(substring(t_hours,charindex(':',t_hours)+1,len(t_hours)-charindex(':',t_hours)),charindex(':',substring(t_hours,charindex(':',t_hours)+1,len(t_hours)-charindex(':',t_hours)))-1)/60.0
from x

输出:

t_hours (No column name)
1:00:00 1.000000
1:00:00 1.000000
64:00:00 64.000000
2:00:00 2.000000
2:00:00 2.000000
1:30:00 1.500000
110:40:12 110.666666
44:38:24 44.633333
14:00:00 14.000000
8:00:00 8.000000
8:00:00 8.000000
47:00:00 47.000000
16:00:00 16.000000
1:00:00 1.000000
8:00:00 8.000000
16:00:00 16.000000
1:33:36 1.550000
19:46:48 19.766666
2:00:00 2.000000
2:00:00 2.000000
8:00:00 8.000000
8:00:00 8.000000
4:30:00 4.500000
6:30:00 6.500000
0:15:00 0.250000
1:00:00 1.000000
32:00:00 32.000000
8:00:00 8.000000
17:00:00 17.000000

db小提琴here

【讨论】:

  • 400:500:600 怎么样? OP 没说是时候了。
  • 我收到错误 Msg 8114, Level 16, State 5, Line 1 将数据类型 varchar 转换为数字时出错。
  • 请分享您遇到错误的字符串。
  • 我使用 select left(t_hours,2) + substring(t_hours,4,2) / 60.0 from X and t_hours column has datatype varchar (15) 下面是 01:00 此列的一些示例值: 00 01:00:00 64:00:00 02:00:00 02:00:00 01:30:00 110:40:12 44:38:24 14:00:00 08:00:00 08:00: 00 47:00:00 16:00:00 01:00:00 08:00:00 16:00:00 01:33:36 19:46:48 02:00:00 02:00:00 08:00: 00 08:00:00 04:30:00 06:30:00 00:15:00 01:00:00 32:00:00 08:00:00 17:00:00
  • 小时部分有三位数。使用我修改后的答案。
【解决方案2】:

用这样的自定义分隔符试试这个:

DECLARE @foo VARCHAR(100) = '440:4500:00';
DECLARE @separator CHAR(1) = ':';

SELECT (CAST(SUBSTRING(@foo, 0, CHARINDEX(@separator, @foo)) AS INT) * 60
        + CAST(SUBSTRING(
                            @foo,
                            LEN(SUBSTRING(@foo, 0, CHARINDEX(@separator, @foo))) + 2,
                            CHARINDEX(@separator, @foo, LEN(SUBSTRING(@foo, 0, CHARINDEX(@separator, @foo))))
                        ) AS INT)
       )/ 60.0;

【讨论】:

    【解决方案3】:

    数据库支持字符串函数。子字符串函数通常称为substr()substring()(或两者兼有)。假设格式正是您指定的,您可以使用:

    select (cast(substr(col, 1, 2) as int) +
            cast(substr(col, 4, 2) as int) / 60.0
           )
    

    许多数据库都有方法来简化这一点。但这种方法应该适用于任何数据库。

    【讨论】:

    • 400:500:600 怎么样? OP 没说是时候了。
    • 我用我自己的列名替换了“col”,但我收到了错误消息 195,级别 15,状态 10,第 1 行“substr”不是可识别的内置函数名称。
    • @BaharYener 。 . .然后使用substring()。正如我在答案中所说,这取决于您未指定的数据库。
    • @GordonLinoff 我很抱歉,你是对的。
    猜你喜欢
    • 1970-01-01
    • 2019-05-11
    • 1970-01-01
    • 2014-03-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多