添加计算字段以将字符串值转换为 T-SQL 中的日期

Adding a calculated field to convert string value to date in T-SQL

我正在尝试将计算字段添加到 SSMS 中的现有 table,这会将 YYYYMMDD 格式的字符串转换为日期格式,但我收到有关字符串字段无效。

我需要计算字段,因为我在字符串字段中有“00000000”值(即 NULL),所以不能在日期计算中使用它。

我使用的代码是:

ALTER TABLE [TEM].[AssignmentRates] 
    ADD [Date_Expired] DATE NULL
    (SELECT CONVERT([date], CASE WHEN [Expiry_Date]='00000000' THEN NULL ELSE [Expiry_Date] END))

其中 [Expiry_Date] 是我要转换的字符串列,[Date_Expired] 是我要添加的计算列的名称。

我收到这个错误:

Invalid column name 'Expiry_Date'

针对该字段名称的两个实例,无法找出原因。如果我 运行 查询作为一个独立的 SELECT 它 returns 需要的结果。

使用 table 别名或完整数据库,table 和它的列名似乎也不起作用。

这可能是非常明显的事情,但我一直无法弄清楚它是什么。

expiry_date 上的错误似乎很清楚 -- 那不是 table 中列的名称。但是你可以简化逻辑:

ALTER TABLE TEM.AssignmentRates ADD Date_Expired AS
    (TRY_CONVERT(date, Expiry_Date));

实际上,嵌套的 SELECT 可能导致了问题。这通常不会用于计算列。

看起来像是语法问题

alter table [TEM].[AssignmentRates] 
    ADD [Date_Expired]
as 
(
case Expiry_Date when '00000000' then null else cast(Expiry_Date as date) end
)

您的语法对于计算列无效。您所拥有的实际上是添加了一个常规列(成功地),但是随后尝试 运行 一个 select 语句导致这些列名错误,因为它没有 from 子句对于上下文。

ALTER TABLE TEM.AssignmentRates /* don't do this */
ADD Date_Expired DATE NULL /* implied end of statement */
(SELECT CONVERT(date, CASE WHEN Expiry_Date = '00000000' THEN NULL ELSE Expiry_Date END));

如果你使用了正确的语法,你至少会得到一个信息错误:

ALTER TABLE TEM.AssignmentRates /* error! */
ADD Date_Expired AS
  (SELECT CONVERT(date, CASE WHEN Expiry_Date = '00000000' THEN NULL ELSE Expiry_Date END);

/*ERROR: Subqueries are not allowed in this context. Only scalar expressions are allowed.*/

但实际上您一开始并不需要子查询:

ALTER TABLE TEM.AssignmentRates /* success */
ADD Date_Expired AS
  CONVERT(date, CASE WHEN Expiry_Date = '00000000' THEN NULL ELSE Expiry_Date END);

Gordon 有一个关于只使用 try_convert() 的观点。