2013-10-07 101 views
0

我想將時間段從'1小時'改爲'10分鐘'。sql group by time period 10分鐘

,改變從 '10' 至'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 
+0

請[ 「*點擊勾選*」](https://ibb.co/ ikqyO6)接受一個答案,要麼是因爲你確實解決了你的問題,要麼是找到你的解決方案最有用(nb:你可以再次點擊撤銷)。接受答案表明問題已經解決,並且在尋找解決方案或尋找解決問題時節省時間。 –

回答

1

看一看這個帖子..

http://social.technet.microsoft.com/wiki/contents/articles/17976.t-sql-group-by-time-interval.aspx

我認爲小組由1 /每小時6點 - 每6分鐘將每10分鐘一班。

重新編寫查詢,我們應該從過去的回答,請參閱:

SELECT DATEPART(minute, logtime)/6 AS [SixthHour], 
      COUNT(loginid) AS [Logins Completed] 
FROM somelog 
GROUP BY DATEPART(minute, logtime)/6 

這將有助於 - http://sqlfiddle.com/#!3/f60f3/1

+0

對不起,我不能這樣做..... http://imagesup.net/?di = 11138120186212 http://imagesup.net/?di=913812018632 – user2853141

0

與想要的標籤等的基礎上,分Leptonator

/6例
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;  

看到this sqlfiddle

額外的意見:

不知道爲什麼你的兩次設定日期參數: 都在爲這兩個參數的值相同以下結果作爲現有:

/* 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 
; 

另外,你可能想使用重新考慮'' 之間的日期憤怒的選擇方法:

where (d.HoDstart >= @periodStart and d.HoDstart < @periodEnd) 

見:What do BETWEEN and the devil have in common?