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
EDYTUJ
Wzrost binarny w CTE zamiast liniowego. 2^100 dat powinno dać rozsądny zakres.