2012-12-26 124 views
0

我試圖獲取表中兩個值之間的時間差並消除所有NULL。帶有WHERE子句的DateDiff NOT 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 無效的列名稱numberofminutes「。

怎麼了?

回答

4

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

你可以,但是,把查詢與別名作爲源的另一個查詢,像這樣:

select * from (
    select DATEDIFF(...) AS NumberOfMinutes 
    FROM tbl_hugo_game) source 
where NumberOfMinutes is not null 
order by NumberOfMinutes asc 
+0

你要使用'NumberOfMinutes IS NOT NULL'。 –

+0

@MichaelPerrenoud,tnx,複製/粘貼變得更好或我:) – SWeko

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)(SELECT子句與DATEDIFF ... AS NumberOfMinutes計算字段步驟b)後進行處理)(WHERE子句)和步驟d)之前(在ORDER BY子句)。這就是爲什麼來自步驟c)(DATEDIFF ... AS NumberOfMinutes)的計算字段不能在WHERE子句(步驟b)中使用,但可以在ORDER BY子句中使用(步驟d)。

參考文獻:SELECT (Transact-SQL) # Logical Processing Order of the SELECT statement

以下步驟顯示的邏輯處理順序,或結合 順序,對於一個SELECT語句。該順序決定了在一個步驟中定義的對象 何時可用於後續步驟中的子句 步驟。例如,如果查詢處理器可以綁定到(訪問)在FROM子句中定義的表或視圖,則這些對象及其 列可供所有後續步驟使用。相反, 因爲SELECT子句是第8步,所以在該子句中定義的任何列別名或派生的 列都不能被前面的 子句引用。但是,它們可以被後續子句引用,例如ORDER BY子句的 。請注意, 語句的實際物理執行是由查詢處理器決定的,並且訂單可能與此列表中的 不同。

  1. FROM
  2. ON
  3. JOIN
  4. WHERE
  5. GROUP BY WITH CUBE或WITH ROLLUP
  6. HAVING
  7. SELECT
  8. DISTINCT
  9. ORDER BY
  10. TOP
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