这句SQL语句问题在哪,一直报错!

q5331006 2014-09-05 08:48:25
SELECT Id,NickName,(datepart(year,getdate()))-substring([BirthDay],1,4) as Age,Sex FROM Users WHERE Age>20
其中,BirthDay为表Users中的字段,这句SQL的语句的目的是为了以生日算出其年龄,但是一直报错,请高手指正。
  还有,因为这样一直报错,我就想到另一个方法,就在直接在SQL里新建了一个Age字段,然后在“计算所得的列规范”的“公式”里写上(datepart(year,getdate()))-substring([BirthDay],1,4),这样可以成功的自动由BirthDay字段算出Age字段,然后SQL语句为:
SELECT Id,NickName,Age,Sex FROM Users WHERE Age>20
但还是报错,不知道是什么情况,请高手帮忙改下,如果行的话,用第二种方法更好,因为程序分为服务端和客户端,数据库是放在服务端的,第一种方法调用的是客户端的时间,而第二种方法调用的是服务端的时间,所以第二种方法更好!
...全文
248 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
q5331006 2014-09-12
  • 打赏
  • 举报
回复
已解决,新建了个视图
jayzhihui 2014-09-07
  • 打赏
  • 举报
回复
不知道BIRTHDAY字段类型,及存储数据是否规范,比较日期差计算年龄可以用 DATEDIFF(YEAR,birthday,GETDATE())
freecodex 2014-09-05
  • 打赏
  • 举报
回复
SELECT Id,NickName,(datepart(year,getdate()))-substring([BirthDay],1,4) as Age,Sex FROM Users WHERE Age>20 错误: Where子句后面不能使用别名Age 原因:SSMS对SQL语发解析是有阶段的,先解析 Where 子句,再解析select子句。显然在解析Where的时候Age并没有定义/引用 修改: SELECT Id,NickName,(datepart(year,getdate()))-substring([BirthDay],1,4) as Age,Sex FROM Users WHERE (datepart(year,getdate()))-substring([BirthDay],1,4) > 20
霜寒月冷 2014-09-05
  • 打赏
  • 举报
回复
BirthDay 这个字段里面的数据是否规范,如果长度不够就会报错的
俺是大菠萝 2014-09-05
  • 打赏
  • 举报
回复
引用 2 楼 u010024618 的回复:
SELECT Id,NickName,(datepart(year,getdate()))-substring([BirthDay],1,4) as Age,Sex FROM Users WHERE Age>20 错误: Where子句后面不能使用别名Age 原因:SSMS对SQL语发解析是有阶段的,先解析 Where 子句,再解析select子句。显然在解析Where的时候Age并没有定义/引用 修改: SELECT Id,NickName,(datepart(year,getdate()))-substring([BirthDay],1,4) as Age,Sex FROM Users WHERE (datepart(year,getdate()))-substring([BirthDay],1,4) > 20
2楼正解,按照sqlserver解析语句的顺序,where条件是优先于select的,因此age是不会被识别的; 另外有一点(datepart(year,getdate()))-substring([BirthDay],1,4) ,前面出来的是数字,后面出来的是字符,尽管系统会自动做隐式转换,但建议还是cast显示转成int类型;
wtujedp 2014-09-05
  • 打赏
  • 举报
回复
报错的信息是什么,另外很可能是BirthDay字段的问题,你看一下,有没有NULL值有的话, 处理一下即可。

22,209

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 疑难问题
社区管理员
  • 疑难问题社区
  • 尘觉
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧