带有WHERE子句的DateDiff NOT NULL

时间:2012-12-26 14:30:25

标签: sql-server sql-server-2008

我试图获取表中两个值之间的时间差并消除所有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'无效。

怎么了?

3 个答案:

答案 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子句。注意实际的物理执行   语句由查询处理器确定,顺序可能不同   从这个清单。

     
      
  1. FROM
  2.   
  3. ON
  4.   
  5. JOIN
  6.   
  7. WHERE
  8.   
  9. GROUP BY
  10.   
  11. WITH CUBE或WITH ROLLUP
  12.   
  13. HAVING
  14.   
  15. 选择
  16.   
  17. DISTINCT
  18.   
  19. ORDER BY
  20.   
  21. TOP
  22.   

答案 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