【问题标题】:SQL - Invalid Column name in self created columnSQL - 自创列中的列名无效
【发布时间】:2020-10-22 20:52:27
【问题描述】:

为什么 SQL 返回错误:“无效的列名 'S_DATE'。”

SELECT [FITTER]
      ,[STARTDATE]
      ,[S_DATE] = LEFT([STARTDATE], 11)


  FROM [DM_Fleetwave].[all_timesheets]
  WHERE cast([S_DATE] as datetime) >= dateadd(mm, -1, getdate())

我需要进行日期转换,因为原始字段 (STARTDATE) 具有字符串格式。这就是我创建仅包含日期的新列的原因。

下面是没有强制转换条件的结果:

FITTER               STARTDATE                    S_DATA
Mekker Sjelland      01/11/2019 00:00:00          01/11/2019

【问题讨论】:

  • 标记适当的数据库名称。
  • 您正在尝试转换 S_Date,但您的列是 S_Data。错字
  • 您不能在 where 子句中使用来自 select 子句的别名。另外,为什么将日期存储为字符串?将日期存储为日期。最后一件事,您的别名是S_Data,而您所指的where 子句是S_Date
  • S_Data / S_date - 仅在这里拼写错误。我不是数据库管理员 - 只有只读访问权限。这就是我问的原因。

标签: sql string datetime


【解决方案1】:

您的代码看起来像 SQL Server。如果是这样,您可以在FROM 子句中使用APPLY 定义列别名:

SELECT t.FITTER, t.STARTDATE, v.S_DATE
FROM [DM_Fleetwave].[all_timesheets] t CROSS APPLY
     (VALUES (LEFT([STARTDATE], 11))) v(S_Date)
WHERE CAST(v.S_DATE as datetime) >= DATEADD(MONTH, -1, getdate());

替代解决方案是:

  • 重复WHERE中的表达式。
  • 使用子查询来定义列。
  • 使用 CTE 定义列。

【讨论】:

    【解决方案2】:

    column_alias 可用于 ORDER BY 子句,但不能用于 WHERE、GROUP BY 或 HAVING 子句。请尝试以下选项-

    你可以看到一些参考Here

    SELECT [FITTER]
      ,[STARTDATE]
      ,[S_DATA] = LEFT([STARTDATE], 11)
    FROM [DM_Fleetwave].[all_timesheets]
    WHERE cast(LEFT([STARTDATE], 11) as datetime) >= dateadd(mm, -1, getdate())
    -- Please make sure your first 11 character from STARTDATE column is always return a string that can be converted to a datetime type
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-09-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-08-16
      相关资源
      最近更新 更多