Получите имена пользователей, вошедших в систему изо дня в день, из базы данных - PullRequest
2 голосов
/ 22 июня 2011

У меня есть такая структура базы данных

username   logged_in            logged_out
------------------------------------------
user1      2011-04-03 19:32:01  2011-04-05 03:41:34
user2      2011-04-01 10:33:42  2011-05-01 23:15:23

Мне нужен список всех пользователей, которые вошли в определенный день, например,

day           logged users
2011-04-01    user2
2011-04-02    user2
2011-04-03    user2
2011-04-03    user1
2011-04-04    user2
2011-04-04    user1
2011-04-05    user2
2011-04-05    user1
...
2011-05-01    user2

Я сейчаспытаясь сделать это с помощью одного SQL-запроса, но я не знаю, как получить временные рамки всех дней, которые зарегистрированы в таблице, и как подключить их к пользователям, вошедшим в систему.

Моя самая большая проблема заключается в том, как создать «виртуальную» таблицу всех дней, охватываемых в базе данных ...

Ответы [ 2 ]

3 голосов
/ 22 июня 2011
DECLARE @from_date DATETIME, @to_date DATETIME

-- populate @from_date and @to_date based on reporting needs
-- possibly using MIN() and MAX() on your logged_in and logged_out fields

DECLARE
  @limit INT
SELECT
  @limit = DATEDIFF(DAY, @from_date, @to_date)
;
WITH
  calendar AS
(
  SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @from_date), 0) AS date, 1 AS inc_a, 2 AS inc_b
UNION ALL
  SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @from_date) + inc_a, 0), inc_a + inc_a + 1, inc_a + inc_a + 2 FROM calendar WHERE inc_a <= @limit
UNION ALL
  SELECT DATEADD(DAY, DATEDIFF(DAY, 0, @from_date) + inc_b, 0), inc_b + inc_b + 1, inc_b + inc_b + 2 FROM calendar WHERE inc_b <= @limit
)

SELECT
  calendar.date,
  your_table.username
FROM
  your_table
INNER JOIN
  calendar
    ON  calendar.date >= DATEADD(DAY, DATEDIFF(DAY, 0, your_table.logged_id), 0)
    AND calendar.date <  your_table.logged_out

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

Двоичный рост в CTE вместо линейного.2 ^ 100 дат должны дать разумный диапазон.

0 голосов
/ 22 июня 2011

За любой день вы можете легко определить, какие пользователи вошли в этот день

declare @thedate datetime
set @thedate = '2011-04-01'

select * from userlog where logged_in between @thedate and @thedate+1

Вам специально нужен отчет в этом формате?

изменить: в ответ на обновленный вопрос

select 
   username,
   DATEADD(DAY, DATEDIFF(DAY, 0, logged_in), 0)
from userlog
group by 
   username, 
   DATEADD(DAY, DATEDIFF(DAY, 0, logged_in), 0)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...