I am trying to write SQL code for SQL Server. The following is an example of raw data:
CREATE TABLE TimeTable ( id int, startDate Datetime, endDate Datetime ); INSERT INTO TimeTable (id, startDate, endDate) VALUES (1, '2015/06/01', '2015/06/10'), (2, '2015/06/03', '2015/06/10'), (3, '2015/06/05', '2015/06/10'), (4, '2015/06/03', '2015/06/06'), (5, '2015/06/01', '2015/06/03');
Visually, the data looks like this:
2015/06/01 | | 2015/06/02 | | 2015/06/03 || || 2015/06/04 || | 2015/06/05 |||| 2015/06/06 |||| 2015/06/07 ||| 2015/06/08 ||| 2015/06/09 ||| 2015/06/10 |||
This format, which I would like to display below (but it can also be grouped by hour).
DateByDay CountOnDay 2015/06/01 2 2015/06/02 2 2015/06/03 4 2015/06/04 3 2015/06/05 4 2015/06/06 4 2015/06/07 3 2015/06/08 3 2015/06/09 3 2015/06/10 3
==================================================== ====================== Thank you guys! I rewrote it, since now I understand that you are creating a datetime range and making a data connection. I redid it to take into account the clock this time.
CREATE TABLE TimeTable ( id int, startDate Datetime, endDate Datetime ); INSERT INTO TimeTable (id, startDate, endDate) VALUES (1, '2015/06/01 01:30', '2015/06/01 07:00'), --FRINGE CASE since 01:30 should still be at June, 01 2015 01:00:00 (2, '2015/06/01 02:00', '2015/06/01 07:00'), (3, '2015/06/01 03:00', '2015/06/01 07:00'), (4, '2015/06/01 04:00', '2015/06/01 07:00'), (5, '2015/06/01 05:00', '2015/06/01 07:00'), (8, '2015/06/01 06:00', '2015/06/01 07:00'); DECLARE @From DATETIME, @To DATETIME SET @From = '2015-06-01 00:00:00' SET @To = '2015-06-02 20:00:00' SELECT DateHour, count(B.id) FROM ( SELECT DATEADD(HOUR,number,@From) DateHour FROM master..spt_values WHERE type = 'P' AND DATEADD(HOUR,number,@From) <= @To ) A LEFT JOIN TimeTable B ON DateHour BETWEEN startDate AND endDate GROUP BY DateHour
http://sqlfiddle.com/#!3/7c36e/2
However, the 01:30 case should appear in 1am DateHour. What would be the best way to fulfill this condition as
DateHour BETWEEN startDate AND endDate
It does not work from 01:00 in the morning, from 01:30 to 07:00