添加计算字段以将字符串值转换为 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()
的观点。
我正在尝试将计算字段添加到 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()
的观点。