【问题标题】:Find Difference between end dates by comparing rows通过比较行查找结束日期之间的差异
【发布时间】:2010-12-15 00:35:32
【问题描述】:

我有一张桌子

----------
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

我的想法是循环表格并创建下一个结束日期,然后使用 datediff 查找比较。我坚持创建下一个结束日期的第一部分,我相信比较的第二部分会很容易。我被困在两者之间。

我的问题是我做的事情是否正确,它变得相当复杂。 我很困惑是通过 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)

这就是我应该如何计算的,那是我试图使用游标,这对我来说太复杂了,无法解决。感谢您的指导。

【问题讨论】:

  • 我没有看到你在这个游标循环中的任何地方进行计数。你能清楚地解释你想要得到什么吗?很可能有一种方法可以在没有光标的情况下做到这一点。
  • 版本 sql server 2008。@cdonner 我被困在创建 nextenddate 的第一部分,以便我可以与同一行中的 nextenddate 和 enddate 进行比较。如果我得到正确的结果,下一部分我会通过比较来计算,但我真的不想使用光标。有没有其他办法。谢谢。

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


【解决方案1】:

好的,我现在明白你的问题了。我知道在 SQL 中有更好的方法可以做到这一点,也许是使用 CTE,但是这个解决方案应该可以工作并且不使用游标。这将为您提供一个完整的表格,其中包含上一个 enddate 的 datediff(如果适用)。然后您可以根据日期差异从中选择。

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

【讨论】:

  • 感谢 jlnorsworthy,我更新了我的问题,解释了我的情况。我需要计算每一行,而不是为特定用户取最小值和最大值。
  • 好的,我现在明白了...当然可以在 sql 中完成,我将不得不拿出我的 SQL 食谱书 :)(不过 sql 专家可以轻松回答)
【解决方案2】:

编辑

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

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

【讨论】:

  • 感谢 amelvin,但我没有使用 startdate,我需要比较特定用户 ID 的每一行的结束日期。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-09-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-10-04
相关资源
最近更新 更多