首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >带WHERE子句NULL的DateDiff

带WHERE子句NULL的DateDiff
EN

Stack Overflow用户
提问于 2012-12-26 14:30:25
回答 3查看 2K关注 0票数 0

我试图在一个表中得到两个值之间的时间差,并消除所有的空值。

代码语言:javascript
复制
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行无效列名“时数”。

怎么了?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2012-12-26 14:33:43

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

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

代码语言:javascript
复制
select * from (
  select DATEDIFF(...) AS NumberOfMinutes 
  FROM tbl_hugo_game) source
where NumberOfMinutes is not null 
order by NumberOfMinutes asc 
票数 4
EN

Stack Overflow用户

发布于 2012-12-26 15:06:31

此SELECT语句的逻辑处理顺序为

( a) FROM tbl_hugo_game

( b) WHERE numberofminutes <> NULL

c)

代码语言:javascript
复制
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子句。注意,语句的实际物理执行由查询处理器决定,顺序可能与此列表不同。

  1. 从…
  2. 在……上面
  3. 加入
  4. 哪里
  5. 按组
  6. 用立方体或卷起
  7. 选择
  8. 分异
  9. 命令由
  10. 顶部
票数 0
EN

Stack Overflow用户

发布于 2012-12-26 16:01:11

其中子句不能访问列别名。对于您的情况来说,重写查询(不使用子选择)更好,也更简单,只需:

代码语言:javascript
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14041995

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档