Reputation: 23
I would like to change the time periods from '1 hour' to '10 mins'.
and change the display time from '10' to '10:00'
declare @periodStart datetime
declare @periodEnd datetime
set @periodStart = CONVERT(varchar(10), GETDATE() - 1, 120)
set @periodEnd = CONVERT(varchar(10), GETDATE() , 120)
set @periodStart = dateadd(HH, datepart(HH,@periodStart), convert(varchar(12),@periodStart,112))
set @periodEnd = dateadd(HH, datepart(HH,@periodEnd), convert(varchar(12),@periodEnd,112))
;with dh
as
(
select top 144
DATEADD(HOUR,ROW_NUMBER() OVER (ORDER BY [Object_id])-1,convert(varchar(12),@periodStart,112)) as HoDstart,
DATEADD(HOUR,ROW_NUMBER() OVER (ORDER BY [Object_id]),convert(varchar(12),@periodStart,112)) as HoDend,
ROW_NUMBER() OVER (ORDER BY Object_id)-1 as DayHour
from sys.columns
)
select d.DayHour, count(f.Hostname) as 'Counter'
from dh d
left join FileBackup f
on f.StartTime < d.HoDend
and f.EndTime >= d.HoDstart
where d.HoDstart between @periodStart and @periodEnd
group by d.DayHour
order by d.DayHour
Upvotes: 0
Views: 1618
Reputation: 35563
with the wanted label etc, based on the minutes/6 example by Leptonator
DECLARE @periodStart datetime
DECLARE @periodEnd datetime
SET @periodStart = dateadd(DAY, datediff(DAY,0, GETDATE()), -1)
SET @periodEnd = dateadd(DAY, datediff(DAY,0, GETDATE()), 0)
SELECT
convert(varchar(5),dateadd(MINUTE,number*10,'00:00:00'),8) AS label
, x.Logins_Completed
FROM master..spt_values AS t1
LEFT JOIN (
SELECT
DATEPART(MINUTE, logtime)/6 AS [SixthHour]
, COUNT(loginid) AS [Logins_Completed]
FROM somelog
WHERE ( logtime >= @periodStart AND logtime < @periodEnd )
GROUP BY DATEPART(MINUTE, logtime)/6
) AS x ON t1.number = x.SixthHour
WHERE t1.type = 'P'
AND t1.number between 0 and 143;
see this sqlfiddle
extra observations:
Not sure why you are setting the date parameters twice: both of the following result in the same values for both parameters as your existing:
/* easier to read */
declare @periodStart datetime
declare @periodEnd datetime
set @periodStart = CONVERT(varchar(10), GETDATE() - 1, 120)
set @periodEnd = CONVERT(varchar(10), GETDATE() , 120)
select
@periodStart
, @periodEnd
;
/* faster */
declare @periodStart datetime
declare @periodEnd datetime
set @periodStart = dateadd(day, datediff(day,0, GETDATE()), -1)
set @periodEnd = dateadd(day, datediff(day,0, GETDATE()), 0)
select
@periodStart
, @periodEnd
;
Additionally you might want to reconsider using 'between' as the date rage selection method:
where ( d.HoDstart >= @periodStart and d.HoDstart < @periodEnd )
see: What do BETWEEN and the devil have in common?
Upvotes: 0
Reputation: 3499
Have a look at this post..
http://social.technet.microsoft.com/wiki/contents/articles/17976.t-sql-group-by-time-interval.aspx
I think the group by 1/6 th of the hour - every sixth of the hour would be every 10 minutes.
Re-writing the query, we should see from the last answer:
SELECT DATEPART(minute, logtime)/6 AS [SixthHour],
COUNT(loginid) AS [Logins Completed]
FROM somelog
GROUP BY DATEPART(minute, logtime)/6
This should help - http://sqlfiddle.com/#!3/f60f3/1
Upvotes: 1