0

我试图获取表中两个值之间的时间差并消除所有 NULL。

SELECT NumberOfMinutes =
   DATEDIFF(millisecond, tbl_hugo_game.time_start, tbl_hugo_game.time_end)
FROM tbl_hugo_game 
WHERE numberofminutes <> NULL 
ORDER BY numberofminutes ASC

没有WHERE-clause 它工作正常,否则:

消息 207,级别 16,状态 1,第 3 行无效的列名称“分钟数”。

怎么了?

4

3 回答 3

4

您不能在where子句中使用列别名。

但是,您可以将具有别名的查询作为另一个查询的源,如下所示:

select * from (
  select DATEDIFF(...) AS NumberOfMinutes 
  FROM tbl_hugo_game) source
where NumberOfMinutes is not null 
order by NumberOfMinutes asc 
于 2012-12-26T14:33:43.543 回答
0

这个 SELECT 语句的逻辑处理顺序是

一种)FROM tbl_hugo_game

b)WHERE numberofminutes <> NULL

C)

SELECT
DATEDIFF(millisecond ,tbl_hugo_game.time_start,tbl_hugo_game.time_end) AS NumberOfMinutes

d)ORDER BY numberofminutes ASC

因此,步骤 c)(带有 DATEDIFF ... AS NumberOfMinutes 计算字段的 SELECT 子句)在步骤 b)(WHERE 子句)之后和步骤 d)(ORDER BY 子句)之前处理。这就是为什么步骤 c) (DATEDIFF ... AS NumberOfMinutes) 中的计算域不能用于 WHERE 子句(步骤 b)但可以用于 ORDER BY 子句(步骤 d)的原因。

参考资料:SELECT (Transact-SQL) # SELECT语句的逻辑处理顺序

以下步骤显示了 SELECT 语句的逻辑处理顺序或绑定顺序。此顺序确定一个步骤中定义的对象何时可用于后续步骤中的子句。例如,如果查询处理器可以绑定(访问)在 FROM 子句中定义的表或视图,则这些对象及其列可用于所有后续步骤。相反,因为 SELECT 子句是第 8 步,所以在该子句中定义的任何列别名或派生列都不能被前面的子句引用。但是,它们可以被后续子句引用,例如 ORDER BY 子句。请注意,语句的实际物理执行由查询处理器确定,并且顺序可能与此列表不同。

  1. 加入
  2. 在哪里
  3. 通过...分组
  4. WITH CUBE 或 WITH ROLLUP
  5. 拥有
  6. 选择
  7. 清楚的
  8. 订购方式
  9. 最佳
于 2012-12-26T15:06:31.627 回答
0

Where 子句无法访问列别名。对于您的情况来说,重写查询(不使用子选择)会更好,更简单,如下所示:

SELECT NumberOfMinutes =
DATEDIFF(millisecond, tbl_hugo_game.time_start, tbl_hugo_game.time_end)
FROM tbl_hugo_game 
WHERE tbl_hugo_game.time_start  IS NOT NULL AND tbl_hugo_game.time_end IS NOT NULL
ORDER BY numberofminutes ASC
于 2012-12-26T16:01:11.087 回答