【问题标题】:getting invalid column error in SQL Server在 SQL Server 中出现无效列错误
【发布时间】:2014-04-24 22:29:18
【问题描述】:

我有以下疑问:

TimeStamp 列中的值为201403240004,因此以下函数将其转换为以下格式:2014-03-24 00:04:00.000

SELECT CONVERT(DATETIME,
   SUBSTRING([TimeStamp],1,4)+'-'+SUBSTRING([TimeStamp],5,2)+'-'
  +SUBSTRING([TimeStamp],7,2)+' '+SUBSTRING([TimeStamp],9,2)+':'
  +SUBSTRING([TimeStamp],11,2)+':00.000') AS MessageDate
FROM Table
   WHERE MessageDate = '2014-03-24 00:04:00.000'

当我尝试在 WHERE 子句中使用 MessageDate 时,为什么我在 sqlserver 中出现无效列名错误?如何在 WHERE 子句中使用转换后的 MessageDate

【问题讨论】:

  • 是 MySQL 还是 SQL Server?
  • 语法匹配 SQL Server。
  • SQL Server 2008。我正在使用 SQL Server Management Studio 运行查询。
  • @EricHauenstein 我知道,查询听起来是familiar to me,但这里的命名相当模糊。

标签: sql-server


【解决方案1】:

您不能真正使用刚刚定义的列。您的选择是:

  1. 显式重写原始查询(我不建议这样做 - 太复杂,也不是太简单):

 

SELECT CONVERT(DATETIME,
   SUBSTRING([TimeStamp],1,4)+'-'+SUBSTRING([TimeStamp],5,2)+'-'
  +SUBSTRING([TimeStamp],7,2)+' '+SUBSTRING([TimeStamp],9,2)+':'
  +SUBSTRING([TimeStamp],11,2)+':00.000') AS MessageDate
FROM Table WHERE CONVERT(DATETIME,
   SUBSTRING([TimeStamp],1,4)+'-'+SUBSTRING([TimeStamp],5,2)+'-'
  +SUBSTRING([TimeStamp],7,2)+' '+SUBSTRING([TimeStamp],9,2)+':'
  +SUBSTRING([TimeStamp],11,2)+':00.000') = '2014-03-24 00:04:00.000'
  1. 将数据插入临时表(如果您需要多次访问,这将是一个不错的选择)
  2. 我最喜欢的选项:使用Common Table Expression

 

;WITH data AS (SELECT CONVERT(DATETIME,
   SUBSTRING([TimeStamp],1,4)+'-'+SUBSTRING([TimeStamp],5,2)+'-'
  +SUBSTRING([TimeStamp],7,2)+' '+SUBSTRING([TimeStamp],9,2)+':'
  +SUBSTRING([TimeStamp],11,2)+':00.000') AS MessageDate
FROM Table
 ) SELECT * FROM data
   WHERE MessageDate = '2014-03-24 00:04:00.000'

【讨论】:

  • ;WITH 是什么?您的陈述是否遵循我使用的SELECT 查询?
  • ;WITH 是一个公共表表达式,在 MSSQL 中非常有用。我现在对帖子进行了改进,将link 添加到有关如何使用 CTE 的一些详细信息中。
【解决方案2】:

您不能直接使用计算列,因为selectstatement 在whereclause 之后处理。使用计算列的一种方法是将其包装在另一个选择中,如下所示:

SELECT * FROM (
  SELECT CONVERT(DATETIME,
     SUBSTRING([TimeStamp],1,4)+'-'+SUBSTRING([TimeStamp],5,2)+'-'
    +SUBSTRING([TimeStamp],7,2)+' '+SUBSTRING([TimeStamp],9,2)+':'
    +SUBSTRING([TimeStamp],11,2)+':00.000') AS MessageDate
  FROM Table) innerQuery
WHERE MessageDate = '2014-03-24 00:04:00.000'

或者你可以在 where 子句中使用完整的计算。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-05
    • 2023-04-03
    • 2013-06-15
    • 1970-01-01
    • 2020-06-16
    • 1970-01-01
    相关资源
    最近更新 更多