SQL服务器:查找最近三年的客户详细信息

时间:2017-03-22 22:05:30

标签: sql sql-server

我有一个表帐户管理员。  在给定日期时,它应该返回在给定日期的最后三年内注册的客户数(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')

1 个答案:

答案 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,并在最终比较中使用实际输入的日期。

希望这有帮助。