Найти разницу между датами окончания путем сравнения строк - PullRequest
0 голосов
/ 15 декабря 2010

у меня есть стол

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

Мне нужно сравнить end_dates между строками, сравнивая, больше ли это 3 дня, и посчитать идентификатор пользователя.

я делаю что-то похожее на это

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-запрос или использовать C # в коде, использующем Linq или что-то подобное.

Обновление : извините, если мне неясно объяснить мой сценарий: я пытаюсь найти счетчик, ни разу клиент не посещал. например: ID пользователя: 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 ]

1 голос
/ 15 декабря 2010

Хорошо, теперь я понимаю вашу проблему. Я знаю, что есть лучший способ сделать это в 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
0 голосов
/ 15 декабря 2010

РЕДАКТИРОВАТЬ

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 для каждой строки, где начальная дата составляет менее трех дней после конечной даты (и 0 в противном случае), можно суммировать, чтобы получить общую сумму.

...