OK, I saw your "Expected Output" and assumed that your query was trying to get "Personals on Board" too. Actually all you are trying to do is get a list of dates (including missing dates presumably) and then find rows that match those dates.
To get the relevant data rows the best performing query is likely to be:
WHERE (a.[check in date] >= @ReportStartDate
AND a.[check in date] < @ReportEndDatePlusOneDay)
(a.check out date] >= @ReportStartDate
AND a.[check out date] < @ReportEndDatePlusOneDay)
(a.check in date] < @ReportStartDate
AND a.[check out date] >= @ReportEndDatePlusOneDay)
It might turn out to be faster to UNION ALL three queries than have the AND / OR combination in a single query.
@ReportEndDatePlusOneDay needs to be midnight (i.e. time portion = 00:00:00) on the day after the last day to be included in the report, e.g.
SELECT @ReportEndDatePlusOneDay = DATEADD(Day, DATEDIFF(Day, 0, @ReportEndDate), 0)
As a separate issue you maybe? want all possible dates (including ones for which there is no actual data), to generate one-row-per-date, in which case I would use a NUMBERS / TALLY table (or an equivalent User Defined function that generates them on-the-fly). Google should find both solutions.
If you need to "round" a date in the SELECT then rather then converting to string (which is both slow and will pass a string-value to APP meaning it cannot be processed as a date for sorting / formatting . etc.) then this will remove the TIME component. You could also do that by CASTing to DATE
SELECT DATEADD(Day, DATEDIFF(Day, 0, [YourDateColumn]), 0)
as this only uses integer maths it is very efficient.
Important to avoid any form of data manipulation (functions etc.) in the WHERE clause because it will not be SARGable and will prevent SQL using indexes etc. to choose the best performing way of locating the data.