【问题标题】:How to add leading zeros to my data?如何在我的数据中添加前导零?
【发布时间】:2015-03-11 02:53:02
【问题描述】:

我有一个 varchar 列,其中包含以下数据的变体: WKKT-FM, 2/21 WKKT-FM, 1/24-2/14 WKKT-FM, 3/14-3/21, 4/11-4/18 IKKT-FM, 12/29-1/12, 1/26-2/09, 6/01-6/15

等等。我需要在几天和几个月前放置前导零。如您所见,其中一些已经有前导零。

我尝试查找 #/ 或 -#,但我必须考虑一些已经有前导零的值。

最好使用函数,因为我必须通过 SELECT 语句获取该字段。

什么是实现这一目标的有效方法?

【问题讨论】:

  • 月份和日期都需要前导零
  • @NoDisplayName 是,适用于月份和日期
  • IKKT-FM, 12/29-1/12, 1/26-2/09, 6/01-6/15 所有这些都存储在单列中?
  • @NoDisplayName 是的,它们都在一个列中。
  • 这是用于 SQL Server 2005 的吗?

标签: sql sql-server sql-server-2005


【解决方案1】:

它很丑,但它应该可以工作。

CREATE FUNCTION udf_AddMissingZero
(
    @val    NVARCHAR(MAX)
)
RETURNS NVARCHAR(MAX)
AS
BEGIN

    SELECT  @val = @val + ' ',
            @val = REPLACE(@val, ' 1/', ' 01/'),
            @val = REPLACE(@val, ' 2/', ' 02/'),
            @val = REPLACE(@val, ' 3/', ' 03/'),
            @val = REPLACE(@val, ' 4/', ' 04/'),
            @val = REPLACE(@val, ' 5/', ' 05/'),
            @val = REPLACE(@val, ' 6/', ' 06/'),
            @val = REPLACE(@val, ' 7/', ' 07/'),
            @val = REPLACE(@val, ' 8/', ' 08/'),
            @val = REPLACE(@val, ' 9/', ' 09/'),

            @val = REPLACE(@val, ' 1-', ' 01-'),
            @val = REPLACE(@val, ' 2-', ' 02-'),
            @val = REPLACE(@val, ' 3-', ' 03-'),
            @val = REPLACE(@val, ' 4-', ' 04-'),
            @val = REPLACE(@val, ' 5-', ' 05-'),
            @val = REPLACE(@val, ' 6-', ' 06-'),
            @val = REPLACE(@val, ' 7-', ' 07-'),
            @val = REPLACE(@val, ' 8-', ' 08-'),
            @val = REPLACE(@val, ' 9-', ' 09-'),            

            @val = REPLACE(@val, '-1/', '-01/'),
            @val = REPLACE(@val, '-2/', '-02/'),
            @val = REPLACE(@val, '-3/', '-03/'),
            @val = REPLACE(@val, '-4/', '-04/'),
            @val = REPLACE(@val, '-5/', '-05/'),
            @val = REPLACE(@val, '-6/', '-06/'),
            @val = REPLACE(@val, '-7/', '-07/'),
            @val = REPLACE(@val, '-8/', '-08/'),
            @val = REPLACE(@val, '-9/', '-09/'),

            @val = REPLACE(@val, '-1-', '-01-'),
            @val = REPLACE(@val, '-2-', '-02-'),
            @val = REPLACE(@val, '-3-', '-03-'),
            @val = REPLACE(@val, '-4-', '-04-'),
            @val = REPLACE(@val, '-5-', '-05-'),
            @val = REPLACE(@val, '-6-', '-06-'),
            @val = REPLACE(@val, '-7-', '-07-'),
            @val = REPLACE(@val, '-8-', '-08-'),
            @val = REPLACE(@val, '-9-', '-09-'),

            @val = REPLACE(@val, '/1/', '/01/'),
            @val = REPLACE(@val, '/2/', '/02/'),
            @val = REPLACE(@val, '/3/', '/03/'),
            @val = REPLACE(@val, '/4/', '/04/'),
            @val = REPLACE(@val, '/5/', '/05/'),
            @val = REPLACE(@val, '/6/', '/06/'),
            @val = REPLACE(@val, '/7/', '/07/'),
            @val = REPLACE(@val, '/8/', '/08/'),
            @val = REPLACE(@val, '/9/', '/09/'),

            @val = REPLACE(@val, '/1-', '/01-'),
            @val = REPLACE(@val, '/2-', '/02-'),
            @val = REPLACE(@val, '/3-', '/03-'),
            @val = REPLACE(@val, '/4-', '/04-'),
            @val = REPLACE(@val, '/5-', '/05-'),
            @val = REPLACE(@val, '/6-', '/06-'),
            @val = REPLACE(@val, '/7-', '/07-'),
            @val = REPLACE(@val, '/8-', '/08-'),
            @val = REPLACE(@val, '/9-', '/09-'),

            @val = REPLACE(@val, '/1 ', '/01 '),
            @val = REPLACE(@val, '/2 ', '/02 '),
            @val = REPLACE(@val, '/3 ', '/03 '),
            @val = REPLACE(@val, '/4 ', '/04 '),
            @val = REPLACE(@val, '/5 ', '/05 '),
            @val = REPLACE(@val, '/6 ', '/06 '),
            @val = REPLACE(@val, '/7 ', '/07 '),
            @val = REPLACE(@val, '/8 ', '/08 '),
            @val = REPLACE(@val, '/9 ', '/09 ')                                      

    RETURN Rtrim(@val)
END
GO

【讨论】:

  • 它几乎可以工作......它将0001, WKKT-FM, 2/7 转换为0001, WKKT-FM, 02/7 - 当天没有前导零。不知道为什么,因为你确实有@val = REPLACE(@val, '/7 ', '/07 '),
  • 哦,我明白了,你也有空间......这就是为什么。
  • 如果我删除空格,那么它还会将 0 附加到以两位数开头的空格。
  • 我编辑了我的答案来处理这种情况,在开头的末尾添加了一个额外的空格。 (最后删除)
  • 老兄......这太棒了..谢谢!
【解决方案2】:

这是一个函数,它将接收一个字符串,并返回带有左填充零的单个数字

CREATE FUNCTION PadNumberLeft (@WrkInfo VARCHAR(50))
RETURNS VARCHAR(100)
AS
BEGIN
    DECLARE @OutputData VARCHAR(25) = ''
    DECLARE @iCount INT = 1

    WHILE @iCount <= LEN(@WrkInfo)
        BEGIN

            IF ISNUMERIC(SUBSTRING(@WrkInfo, @iCount, 1)) = 1 AND
                ISNUMERIC(SUBSTRING(@WrkInfo, @iCount + 1, 1)) = 1
                BEGIN
                    SET @OutputData = @OutputData + SUBSTRING(@WrkInfo, @iCount, 3) 
                    SET @iCount = @iCount + 3
                END
            IF ISNUMERIC(SUBSTRING(@WrkInfo, @iCount, 1)) = 1 AND
                ISNUMERIC(SUBSTRING(@WrkInfo, @iCount + 1, 1)) = 0
                BEGIN
                    SET @OutputData = @OutputData + '0' + SUBSTRING(@WrkInfo, @iCount, 2) 
                    SET @iCount = @iCount + 1
                END

            SET @iCount = @iCount + 1
        END
    RETURN @OutputData 
END;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-11-26
    • 2016-07-11
    • 1970-01-01
    相关资源
    最近更新 更多