从另一列的特定字符在计算的 SQL 列中构建一个字符串
Build a string in a computed SQL column from specific characters from another column
我不知道这是否可行,但我想根据 SQL 服务器 table.
中的相邻列填写一列
如下,我们想通过6th和7th以及[=第 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
,如 2102
、2103
等:
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
我不知道这是否可行,但我想根据 SQL 服务器 table.
中的相邻列填写一列如下,我们想通过6th和7th以及[=第 29=]3 和 第 4 个字符 来自 BillingDateTo
.
我不确定它是否重要,但 BillingDateTo
也是一个基于另一列 BillingDateFrom
的计算列,该列距 BillingDateFrom
.
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
,如 2102
、2103
等:
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