我试图在一个表中得到两个值之间的时间差,并消除所有的空值。
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,它将正常工作,否则:
Msg 207,级别16,状态1,第3行无效列名“时数”。
怎么了?
发布于 2012-12-26 14:33:43
不能在where子句中使用列别名。
但是,您可以将别名作为另一个查询的源,如下所示:
select * from (
select DATEDIFF(...) AS NumberOfMinutes
FROM tbl_hugo_game) source
where NumberOfMinutes is not null
order by NumberOfMinutes asc 发布于 2012-12-26 15:06:31
此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的SELECT子句.由于NumberOfMinutes计算字段)是在步骤b之后( WHERE子句)和步骤d之前( ORDER子句)处理的。这就是为什么步骤c中的计算字段(DATEDIFF ).在WHERE子句(步骤b)中不能使用,但可以在ORDER子句中使用(步骤d)。
参考资料:选择(Transact-SQL) # SELECT语句的逻辑处理顺序
以下步骤显示SELECT语句的逻辑处理顺序或绑定顺序。此顺序确定何时在一个步骤中定义的对象可用于后续步骤中的子句。例如,如果查询处理器可以将FROM子句中定义的表或视图绑定到(access),则这些对象及其列可用于所有后续步骤。相反,由于SELECT子句是步骤8,所以前面的子句不能引用该子句中定义的任何列别名或派生列。但是,它们可以被后续的子句引用,例如ORDER子句。注意,语句的实际物理执行由查询处理器决定,顺序可能与此列表不同。
发布于 2012-12-26 16:01:11
其中子句不能访问列别名。对于您的情况来说,重写查询(不使用子选择)更好,也更简单,只需:
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 ASChttps://stackoverflow.com/questions/14041995
复制相似问题