web-dev-qa-db-ja.com

時間単位または10分単位で時間をグループ化する方法

私がそうするときのように

SELECT [Date]
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY [Date]

グループ期間を指定する方法

MS SQL 2008

第2編集

私はしようとしています

SELECT MIN([Date]) AS RecT, AVG(Value)
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY (DATEPART(MINUTE, [Date]) / 10)
  ORDER BY RecT

%10を/ 10に変更しました。ミリ秒なしで日付を出力することは可能ですか?

149
Cynede

やっと

GROUP BY
DATEPART(YEAR, DT.[Date]),
DATEPART(MONTH, DT.[Date]),
DATEPART(DAY, DT.[Date]),
DATEPART(HOUR, DT.[Date]),
(DATEPART(MINUTE, DT.[Date]) / 10)
188
Cynede

私はパーティーに非常に遅れています、しかしこれは既存の答えのどれにも現れません:

GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, date_column) / 10 * 10, 0)
  • 10およびMINUTEの用語は、それぞれ任意の数字および DATEPART に変更できます。
  • これはDATETIMEの値、です。つまり、です。
    • それは長い時間間隔にわたってうまく働きます。 (年の間に衝突はありません。)
    • SELECTステートメントに含めると、出力には指定したレベルで切り捨てられたきれいな出力の列が表示されます。
SELECT   DATEADD(MINUTE, DATEDIFF(MINUTE, 0, aa.[date]) / 10 * 10, 0) AS [date_truncated],
         COUNT(*) AS [records_in_interval],
         AVG(aa.[value]) AS [average_value]
FROM     [friib].[dbo].[archive_analog] AS aa
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, 0, aa.[date]) / 10 * 10, 0)
ORDER BY [date_truncated]
45
Michael

T-SQLでは、次のことができます。

SELECT [Date]
  FROM [FRIIB].[dbo].[ArchiveAnalog]
  GROUP BY [Date], DATEPART(hh, [Date])

または

分単位でDATEPART(mi, [Date])

または

10分でDATEPART(mi, [Date]) / 10を使います(Timothyが提案したように)

16
tzup

10分間隔では、

GROUP BY (DATEPART(MINUTE, [Date]) / 10)

TzupとPieter888で既に言及されているように... 1時間間隔を行うには、ちょうど

GROUP BY DATEPART(HOUR, [Date])
13
Timothy Khouri

のようなものになります

select timeslot, count(*)  
from 
    (
    select datepart('hh', date) timeslot
    FROM [FRIIB].[dbo].[ArchiveAnalog]  
    ) 
group by timeslot

(100%構文については確信していません。私はもっとOracleのような人です)

Oracleの場合:

SELECT timeslot, COUNT(*) 
FROM
(  
    SELECT to_char(l_time, 'YYYY-MM-DD hh24') timeslot 
    FROM
    (
        SELECT l_time FROM mytab  
    )  
) GROUP BY timeslot 
7
Frank Schmitt

作者が出した最初の答えはかなりうまくいっています。この考えを拡張するために、次のようにすることができます。

group by datediff(minute, 0, [Date])/10

これはあなたが60分より長い時間でグループ分けすることを可能にするでしょう。

6
Derek

MySqlの場合:

GROUP BY
DATE(`your_date_field`),
HOUR(`your_date_field`),
FLOOR( MINUTE(`your_date_field`) / 10);
3
nobilist
select from_unixtime( 600 * ( unix_timestamp( [Date] ) % 600 ) ) AS RecT, avg(Value)
from [FRIIB].[dbo].[ArchiveAnalog]
group by RecT
order by RecT;

2つの600をグループ化したい任意の秒数に置き換えます。

あなたがこれを頻繁に必要とし、そしてArchiveという名前が示すようにテーブルが変わらないのであれば、日付(&time)を変換してunixtimeとしてテーブルに保存するほうが少し速いでしょう。

0
theking2

私の解決策は、日付の間隔でテーブルを作成してから、テーブル内の日付の間隔を使用してグループ化したいデータにこのテーブルを結合するための関数を使用することです。データを表示するときに、日付の間隔を簡単に選択できます。

CREATE FUNCTION [dbo].[fn_MinuteIntervals]
    (
      @startDate SMALLDATETIME ,
      @endDate SMALLDATETIME ,
      @interval INT = 1
    )
RETURNS @returnDates TABLE
    (
      [date] SMALLDATETIME PRIMARY KEY NOT NULL
    )
AS
    BEGIN
        DECLARE @counter SMALLDATETIME
        SET @counter = @startDate
        WHILE @counter <= @endDate
            BEGIN
                INSERT INTO @returnDates VALUES ( @counter )
                SET @counter = DATEADD(n, @interval, @counter)
            END
        RETURN
    END
0
user3193141

私はこれでショーに遅刻しているのを知っています、しかし私はこれを使いました - かなり単純なアプローチ。これにより、丸めの問題なしに60分スライスを取得できます。

Select 
   CONCAT( 
            Format(endtime,'yyyy-MM-dd_HH:'),  
            LEFT(Format(endtime,'mm'),1),
            '0' 
          ) as [Time-Slice]
0
jesse

SQL Server 2012では、SQL Server 2008 R2で機能すると考えていますが、時間をミリ秒に短縮するには、次の方法を使用します。

DATEADD(MILLISECOND, -DATEDIFF(MILLISECOND, CAST(time AS DATE), time) % @msPerSlice, time)

これは以下によって動作します。

  • 固定小数点と目標時間の間のミリ秒数を取得する:
    @ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
  • これらのミリ秒をタイムスライスに分割することの残りを取る:
    @rms = @ms % @msPerSlice
  • スライス時間を取得するために、ターゲット時間にその残りの負の値を加算します。
    DATEADD(MILLISECOND, [email protected], time)

残念なことに、これはマイクロ秒およびより小さな単位であふれているので、より大きく、より細かいデータセットはあまり便利でない固定小数点を使用する必要があるでしょう。

私は厳密にこれをベンチマークしていないし、私はビッグデータではないので、あなたの走行距離は異なるかもしれません、しかしパフォーマンスは私たちの機器やデータセットで試みた他の方法よりも著しく悪くありませんでした。わたしたちのため。

0
tychon
declare @interval tinyint
set @interval = 30
select dateadd(minute,(datediff(minute,0,[DateInsert])/@interval)*@interval,0), sum(Value_Transaction)
from Transactions
group by dateadd(minute,(datediff(minute,0,[DateInsert])/@interval)*@interval,0)
0
Rodas PT