【问题标题】:Build a string in a computed SQL column from specific characters from another column根据另一列中的特定字符在计算的 SQL 列中构建字符串
【发布时间】:2022-01-15 11:22:24
【问题描述】:

我不知道这是否可能,但我想根据 SQL Server 表中的相邻列填充一列。

如下,我们想通过使用6th7th以及3rd动态确定BillingDealerPeriodID第 4 个字符来自BillingDateTo

我不确定这是否重要,但BillingDateTo 也是基于另一列BillingDateFrom 的计算列,距离BillingDateFrom 7 天。

BillingDateTo 计算列的公式为:

(dateadd(day,(7),[BillingDateFrom]))

如果结果必须是 2102 或 2103 而不是 0221 和 0321,那也可以。

BillingDateTo BillingDealerPeriodID
2021-02-28 00:00:00.000 0221
2021-03-07 00:00:00.000 0321

【问题讨论】:

    标签: sql sql-server-2012 calculated-columns string-concatenation


    【解决方案1】:

    这将产生YYMM,如21022103等:

    SELECT CONVERT(char(4), GETDATE(), 12);
    

    所以我们可以将它添加到现有的计算列公式中。因为BillingDateTo 是一个计算列,所以不能嵌套它们;您必须为 BillingDateFrom 重复计算列表达式,或者,而不是使用多个计算列,只需在视图中公开这些额外的计算。

    ALTER TABLE dbo.whatever ADD BillingDealerPeriodID 
      AS (CONVERT(char(4), DATEADD(DAY, 7, BillingDateFrom), 12));
    

    如果你真的想要MMYY 而不是YYMM,你可以这样做:

    SELECT STUFF(CONVERT(char(10), GETDATE(), 110),3,6,'');
    

    所以作为计算列:

    ALTER TABLE dbo.whatever ADD BillingDealerPeriodID 
      AS STUFF(CONVERT(char(10), DATEADD(DAY, 7, BillingDateFrom), 110),3,6,'');
    

    The documentation 没有很好地明确说明计算列不能嵌套,除了以下内容:

    表达式可以是非计算的列名

    但是,如果您尝试会导致错误消息非常明确。

    顺便说一句,我强烈建议远离使用 FORMAT() 的变体——虽然它方便、直观且更好地匹配其他更复杂语言的功能,但它是 unacceptably slow(并且也不能关闭-像 Azure SQL Edge 一样拍摄)。

    【讨论】:

      【解决方案2】:

      不能基于另一个计算列创建计算列。

      因此,您必须将其基于真实的列,例如 BillingDateFrom

      ALTER TABLE dbo.your_table
       ADD BillingDealerPeriodID
        AS (FORMAT(dateadd(day,7,[BillingDateFrom]), 'MMyy'));
      

      dbfiddle here

      上的演示

      【讨论】:

        【解决方案3】:

        您可以使用EXTRACT()FORMAT()。例如:

        select format(datepart(month, BillingDateTo), '0#') +
               format(datepart(year, BillingDateTo) - 2000, '0#')
        from t
        

        结果:

        (No column name)
        ----------------
        0221
        0321
        

        请参阅db<>fiddle 的运行示例。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2018-04-14
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多