0

期間を「1 時間」か​​ら「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
4

2 に答える 2

1

この投稿を見てください..

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

グループは 1/6 時間ごとにグループ化すると思います。6 分の 1 時間ごとは 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

于 2013-10-07T03:59:40.597 に答える
0

レプトネーターによる分/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;    

このsqlfiddleを参照してください

追加の観察:

日付パラメーターを 2 回設定している理由がわかりません。次の両方の結果は、既存のパラメーターと同じ値になります。

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

さらに、日付範囲の選択方法として「before」を使用することを再検討することをお勧めします。

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

参照: BETWEEN と悪魔の共通点は何ですか?

于 2013-10-07T05:30:54.360 に答える