通过比较行查找结束日期之间的差异

时间:2010-12-15 00:35:32

标签: c# sql linq tsql sql-server-2008

我有一张桌子

----------
User
----------
userID(pk)
startdate // update : i am not using this field.
enddate

我需要比较行之间的end_dates,比较它是否超过3天并计算用户ID。

我正在做类似的事情

WHILE @@FETCH_STATUS = 0
BEGIN

   select @lastrowID = max(rowid) from @User
   if (@userid  = (select userId from @User where rowid = @lastRowID))
   begin
       update @User set NextEndDate= @endDate where rowid = @lastRowID and userid = @userid
   end
   else
   begin
       insert @UserTable (userid, EndDate,NextEndDate) values (@userid, @endDate,@NextEndDate)
   end
END

我的想法是围绕表格并创建一个nextend日期,然后使用datediff找到比较。我坚持创建nextend日期的第一部分,我相信比较的第二部分会很容易。我被困在中间。

我的问题是我做的是正确的事,它变得非常复杂。 我很困惑是通过SQL查询得到结果还是在使用Linq或类似代码的代码后使用C#。

更新: 对不起,如果我不清楚解释我的情景:我正在试图找到计数,客户访问的次数。 例如: userid:1可能每天访问一次或每月访问一次。所以我需要得到计数(用户访问的频率)。所以如果用户访问结束日期是

userid     enddate
1          1/1/2010
1          1/2/2010  count 1
1          1/10/2010 count 2 difference is more than 3 days
1          1/13/2010 count 2 ( because diff is less than 3 days)

多数民众赞成我应该如何计算,那就是我试图使用游标,这对我来说太复杂了。感谢您的指导。

2 个答案:

答案 0 :(得分:1)

好的,我现在明白你的问题。我知道有一种更好的方法可以在SQL中执行此操作,可能使用CTE,但此解决方案应该可以使用并且不使用游标。这将为您提供一个完整的表格,其中包含前一个结束日期(如适用)。然后,您可以根据日期来选择它。

select u1.*, datediff(day, u2.enddate, u1.enddate) as days from
    (
    select userid, enddate, row_number() over(partition by userid order by userid, enddate) as rownumber
    from [user]
    ) u1
    left join 
    (
    select userid, enddate, row_number() over(partition by userid order by userid, enddate) as rownumber
    from [user]
    )u2
    on u1.userid = u2.userid
    and u1.rownumber = u2.rownumber + 1

答案 1 :(得分:0)

修改

declare @table table (userid int, startdate datetime, enddate datetime)

insert into @table (userid, startdate, enddate) values (1, '01-JAN-2010', '2-JAN-2010')
insert into @table (userid, startdate, enddate) values (2, '01-JAN-2010', '3-JAN-2010')
insert into @table (userid, startdate, enddate) values (3, '01-JAN-2010', '4-JAN-2010')
insert into @table (userid, startdate, enddate) values (4, '01-JAN-2010', '5-JAN-2010')
insert into @table (userid, startdate, enddate) values (5, '01-JAN-2010', '6-JAN-2010')
insert into @table (userid, startdate, enddate) values (6, '01-JAN-2010', '7-JAN-2010')
insert into @table (userid, startdate, enddate) values (7, '01-JAN-2010', '8-JAN-2010')

select SUM(yn) as dueinmorethanthreedays from 
  (select 
    (case when DATEADD(day,3,startdate) < enddate then 1 else 0 end) as yn 
    from @table
  ) as derived

一个子查询为每一行返回1,其中startdate小于enddate的三天(否则为0)可以相加得到总数。