从另一列的特定字符在计算的 SQL 列中构建一个字符串

Build a string in a computed SQL column from specific characters from another column

我不知道这是否可行,但我想根据 SQL 服务器 table.

中的相邻列填写一列

如下,我们想通过6th7th以及[=第 29=]3 和 第 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

这将产生 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 没有很好地明确说明计算列不能嵌套,除了以下内容:

The expression can be a noncomputed column name

但是,如果您尝试得到的错误消息非常明确。

顺便说一句,我强烈建议远离使用 FORMAT() 的变体 - 虽然它方便、直观,并且更好地匹配其他更复杂语言的功能,但它是 unacceptably slow(而且在像 Azure SQL Edge 这样的分支中不起作用。

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

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

结果:

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

参见 db<>fiddle 中的 运行 示例。

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

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

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

演示 db<>fiddle here