【问题标题】:Adding a calculated field to convert string value to date in T-SQL在 T-SQL 中添加计算字段以将字符串值转换为日期
【发布时间】:2019-10-01 18:04:20
【问题描述】:

我正在尝试将计算字段添加到 SSMS 中的现有表中,这会将格式为 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] 是我要添加的计算列的名称。

我收到此错误:

列名“Expiry_Date”无效

反对该字段名称的两个实例,并且无法找出原因。如果我作为独立的SELECT 运行查询,它会返回所需的结果。

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

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

【问题讨论】:

  • 错误似乎很明显。您需要引用一个有效的列。

标签: sql-server ssms calculated-columns


【解决方案1】:

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

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

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

【讨论】:

  • TRY_CONVERT 在这种情况下为我工作。感谢您的帮助戈登。非常感谢。
【解决方案2】:

看起来是语法问题

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

【讨论】:

    【解决方案3】:

    您的语法对于计算列无效。您实际上是添加了一个常规列(成功),但随后尝试运行导致这些列名错误的 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() 的观点。

    【讨论】:

      猜你喜欢
      • 2019-10-26
      • 2019-02-04
      • 1970-01-01
      • 1970-01-01
      • 2020-12-29
      • 2021-12-25
      • 2015-08-23
      相关资源
      最近更新 更多