我试图获取表中两个值之间的时间差并消除所有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
- 条款它工作正常,
否则:
Msg 207,Level 16,State 1,Line 3 列名称'numberofminutes'无效。
怎么了?
答案 0 :(得分:4)
您不能在where
子句中使用列别名。
但是,您可以将带有别名的查询作为另一个查询的源,如下所示:
select * from (
select DATEDIFF(...) AS NumberOfMinutes
FROM tbl_hugo_game) source
where NumberOfMinutes is not null
order by NumberOfMinutes asc
答案 1 :(得分:0)
此SELECT语句的逻辑处理顺序为
a)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) # Logical Processing Order of the SELECT statement
以下步骤显示逻辑处理顺序或绑定 order,用于SELECT语句。此顺序确定对象的时间 在一个步骤中定义的内容可供后续条款使用 脚步。例如,如果查询处理器可以绑定(访问) FROM子句中定义的表或视图,这些对象及其对象 列可用于所有后续步骤。反过来, 因为SELECT子句是步骤8,任何列别名或派生 该子句中定义的列不能通过前面引用 条款。但是,它们可以通过后续条款引用,例如 ORDER BY子句。注意实际的物理执行 语句由查询处理器确定,顺序可能不同 从这个清单。
- FROM
- ON
- JOIN
- WHERE
- GROUP BY
- WITH CUBE或WITH ROLLUP
- HAVING
- 选择
- DISTINCT
- ORDER BY
- TOP
醇>
答案 2 :(得分:0)
Where子句无法访问列别名。 对于你的情况来说,更好更简单地重写查询(不使用subselect)简单如下:
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