【问题标题】:TSQL UDF To Split String Every 8 CharactersTSQL UDF 每 8 个字符拆分字符串
【发布时间】:2011-08-30 01:30:33
【问题描述】:

有人决定将一堆时间放在一个列中,因此列值可能如下所示:

08:00 AM01:00 PM

另一列包含以下格式的日期;

20070906

我想编写一个 UDF 以在单个 SQL 查询中规范化这些数据,因此我可以为上面的示例取回 2 行 datetime 类型

2007-09-06 08:00:00.000
2007-09-06 13:00:00.000

转换为 datetime 类型很简单...但我需要将时间部分每 8 个字符拆分一次,以获取单独的超时时间。

有人知道现有的 UDF 可以执行此操作吗?

【问题讨论】:

  • 使用 SUBSTRING 有什么问题? msdn.microsoft.com/en-us/library/ms187748.aspx
  • 每 8 个字符,而不仅仅是 8 个字符。 SUBSTRING 生成单个字符串。
  • 我很清楚这一点。建议你多次调用它......就像循环一样!

标签: sql-server tsql user-defined-functions


【解决方案1】:

试试这个,它会把你的字符串分成指定长度的块:

create function SplitString
(   
    @str varchar(max),
    @length int
)
returns @Results table( Result varchar(50) ) 
AS
begin
    declare @s varchar(50)
    while len(@str) > 0
    begin
        set @s = left(@str, @length)
        set @str = right(@str, len(@str) - @length)
        insert @Results values (@s)
    end
    return 
end

例如:

select * from dbo.SplitString('08:00 AM01:00 PM', 8)

会给出这个结果:

结果

08:00 上午

01:00 下午

【讨论】:

  • 您建议我如何将其加入源表?
  • 大错误。尝试将长度设置为大于 4 并看到它已经无限计算并且无法得到结果。我检查了它并检查了@Rhyno 的方式,发现他的解决方案运行良好。
【解决方案2】:

上面的查询中有一个错误,下面的查询修复了这个问题。 另外,我使返回的表包含一个序列列,以便可以确定拆分所在的序列:

CREATE function SplitString
(   
    @str varchar(max),
    @length int
)
RETURNS @Results TABLE( Result varchar(50),Sequence INT ) 
AS
BEGIN

DECLARE @Sequence INT 
SET @Sequence = 1

    DECLARE @s varchar(50)
    WHILE len(@str) > 0
    BEGIN
        SET @s = left(@str, @length)
        INSERT @Results VALUES (@s,@Sequence)

        IF(len(@str)<@length)
        BREAK

        SET @str = right(@str, len(@str) - @length)
        SET @Sequence = @Sequence + 1
    END
    RETURN 
END

【讨论】:

  • +1 了不起的人。我尝试了一些解决方案,但其中一些在大长度或小长度上无法工作或性能不佳。您更正了已接受的答案,并且您的方法有效。这是其他解决方案之一得到接受标志但没用。 stackoverflow.com/questions/10852612/… 如果您不介意,我想根据您的解决方案写一个答案。再次感谢。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-17
  • 1970-01-01
  • 1970-01-01
  • 2014-12-17
相关资源
最近更新 更多