我有一个表帐户管理员。 在给定日期时,它应该返回在给定日期的最后三年内注册的客户数(DOE)。
这是我的查询,它没有返回任何值.plz帮我改变.TIA
select count(ACID) as numberofcustomers from ACCOUNTMASTER
where
datepart(yy,doe)>= datepart(yy,dateadd(yy,-2,'2012/04/10'))
and
doe<= datepart(yy,'2012/04/10')
答案 0 :(得分:0)
您的问题显然是对DATEPART
的作用以及如何比较日期的误解。因此,让我们细分您的WHERE
条款。
where
datepart(yy,doe)>= datepart(yy,dateadd(yy,-2,'2012/04/10'))
此子句将列doe中日期的年份值与固定日期之前两年的日期年份进行比较,表示用户提交的日期。因此,datepart(yy, dateadd(yy, -2,'2012/04/10'))
将值2010返回为int
。将其与datepart(yy,doe)
进行比较,后者返回doe
列中存储的日期值的整数年份。由于这两种数据类型都是int,
,因此比较可以实现它应有的功能,并从2010/01/01及更高版本的记录中返回信息。这里没有问题 - 除非您希望从2010 / 04/10 返回数据,在这种情况下,您希望将值dateadd(yy, -2,'2012/04/10')
与doe
中的值进行比较列。
and doe<= datepart(yy,'2012/04/10')
在这种情况下,存在比较问题。您正在尝试将整数值2012与doe
列中的日期值进行比较。由于这些数据类型不同,我们需要找出所比较的内容。
我假设doe
列是日期时间数据类型(如果它是日期或日期时间2,您将收到错误。)可以将整数与日期时间进行比较,因为SQL Server使用数字数据类型表示日期时间数据类型。值2012表示日期1905/07/06(使用CAST(2012 as datetime)
自己查看),因此WHERE子句转换为类似:
WHERE datepart(year, doe) >= 2010
AND doe < '1905/07/06'
由于日期不能同时在1905年7月之前以及2010年1月或之后,因此不会返回任何数据。
这里实际需要的是取决于您是否只想比较年数,或者您想要比较年/月/日。仅限年份,您可以将最后一个doe
替换为DATEPART(year, doe)
并使用功能查询,尽管不是快速查询。要比较年/月/日,请使用上面提到的DATEADD
,并在最终比较中使用实际输入的日期。
希望这有帮助。