source

시간대별 또는 10분 단위로 시간을 분류하려면 어떻게 해야 합니까?

lovecheck 2023. 9. 9. 09:37
반응형

시간대별 또는 10분 단위로 시간을 분류하려면 어떻게 해야 합니까?

내가 할때처럼

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

그룹 기간은 어떻게 지정할 수 있습니까?MS SQL 2008을 사용하고 있습니다.

나는 이것을 시도해 보았는데, 둘다% 10그리고./ 10.

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

날짜 출력을 밀리초 없이 할 수 있습니까?

마침내 끝이 난

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

짧고달콤한

GROUP BY DATEDIFF(MINUTE, '2000', date_column) / 10

이번 사건의 핵심을 이루는 데릭의 대답에 대해 진심으로 감사하는 마음으로 말입니다.

실용화

SELECT   DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
                                                             AS [date_truncated],
         COUNT(*) AS [records_in_interval],
         AVG(aa.[value]) AS [average_value]
FROM     [friib].[dbo].[archive_analog] AS aa
-- WHERE aa.[date] > '1900-01-01'
GROUP BY DATEDIFF(MINUTE, '2000', aa.[date]) / 10
-- HAVING SUM(aa.[value]) > 1000
ORDER BY [date_truncated]

상세 정보 및 추가 해설

빈 간격 크기

MINUTE그리고.10항들은 다른 시간 간격으로 그룹화하기 위해 임의의 항과 1정수로 각각 변경될 수 있습니다.예를들면,10와 함께MINUTE입니다. 10 ㎜ 입니다.6와 함께HOUR6시간 간격입니다.

구간을 많이 변경하면 변수로 선언하여 이득을 볼 수 있습니다.

DECLARE @interval int = 10;

SELECT   DATEADD(MINUTE, DATEDIFF(…) / @interval * @interval, '2000')
…
GROUP BY                 DATEDIFF(…) / @interval

값종류

되는 과 입니다 은 입니다 의 상대 세트입니다.2000-01-01 00:00는 긴 소스가하다는 것을 의미합니다. 즉, 긴 시간 간격의 데이터 소스는 문제가 없습니다.몇몇 다른 대답들은 몇 년 사이에 충돌이 있습니다.

GROUP BY격로을로다고로ats격을n로yngedaeDATEADD호출하면 값이 반환됩니다.그것을 포함해서.SELECT에 timestampstatement가 timestamp.statement린가는다을일는다hentraee위의 "실용적 사용" 예를 참조하십시오.

빈 간격에 대한 레이블 이동

)/) 의 의 작업 DATEDIFF을 정수을로다다 (a))로.FLOOR단축키)를 사용하여 각 행에 대한 시간 간격의 시작을 표시합니다.SELECT산출량.

구간의 중간 또는 으로 행에 레이블을 지정하려면 다음의 두 번째 항에서 분할을 조정할 수 있습니다.DATEADD아래 굵은 부분과 함께:

  • 끝: :…) / 10 * 10 + 10 , '2000'), 대니얼 엘킹턴에게 을 돌렸습니다
  • : :…) / 10 * 10 + (10 / 2.0) , '2000').

타임스탬프가 간격의 반과 간격의 반을 나타내도록 간격을 안쪽으로 반올림하려면 다음과 같은 방법을 사용합니다.

DATEADD(MINUTE, ROUND(1. * DATEDIFF(MINUTE, '2000', date_column) / 10, 0) * 10, '2000')

를 합니다.1.그 대신에 분할을 하지 않을 겁니다수정해야 합니다.GROUP BY어울리는 것, 그리고 당신은 전체를 사용하기를 원할 수 있습니다.ROUND(…)예상치 못한 플로트 라운딩을 피하기 위한 식입니다.

날짜수학트리비아

'2000'math를 하는 "입니다. SQL은 "math"입니다.의플드용을 사용합니다.0앵커의 경우, 그러나 JereonH는 보다 최근 날짜를 초 단위 2또는 밀리초 단위로 그룹화할 때 정수 오버플로가 발생한다는 것을 발견했습니다.

데이터가 수 3세기에 걸쳐 있는 경우, 에서 단일 앵커 날짜를 사용합니다.GROUP BY몇 초 동안 또는 몇 밀리초 동안에도 오버플로가 발생합니다.이러한 쿼리에 대해 각 행에 해당 날짜의 자정에 대한 비닝 비교를 고정하도록 요청할 수 있습니다.

Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ Δ'2000'쿼리에 나타나는 위치:

  • DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
  • CONVERT(DATETIME, CONVERT(DATE, aa.[date]))

쿼리를 전혀 읽을 수 없지만 사용할 수 있습니다.


1 당신이 다 원한다면:00에며의를다를rtn의p는 정수를 사용합니다.DATEPART의 최대치는 균등하게 나눌 수 있습니다.4반대의 예로, 결과를 13분 또는 37시간 빈으로 그룹화하는 경우 일부는 건너뜁니다.:00s, 그래도 잘겁니다.
수학은 2 ≈ 4.29E+9라고 합니다.이것은 a를 의미합니다.DATEPARTSECOND, 어느 쪽이든 43억 초의 시간이 주어지는데, 이 시간은 "임시 날짜 ± 136년"까지 계산됩니다.마찬가지로 2밀리초는 ≈49.7일입니다.
3 데이터가 실제로 수 세기 또는 수 밀리세컨드에 걸쳐 있는데도 1초 또는 수 밀리세컨드에 정확하다면 축하드립니다.뭘 하던 간에 계속 하세요.
4 시계의 상단에 12가 있는 이유가 궁금하다면, 어떻게 5가 6(12의 절반) 이하의 정수 중 12의 인자가 아닌 유일한 정수인지 돌아보십시오.그렇다면 5 × 12 = 60임을 유의합니다.빈 크기는 시간, 분, 초로 다양하게 선택할 수 있습니다.

T-SQL에서는 다음을 수행할 수 있습니다.

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

아니면

미세하게 사용법으로DATEPART(mi, [Date])

아니면

사용합니다.DATEPART(mi, [Date]) / 10가 제안한 가한럼)럼한(가) )

10분 간격으로 당신은

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

이미 tzup과 Pieter888에 의해 언급되었듯이... 한 시간 간격을 두는 것입니다.

GROUP BY DATEPART(HOUR, [Date])

어떤 것이 되어야 합니다.

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 

저자가 제시한 원답은 꽤 잘 통합니다.이 아이디어를 확장하기 위해, 당신은 다음과 같은 것을 할 수 있습니다.

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

이것은 여러분이 60분보다 더 긴 시간동안 그룹을 만들 수 있게 해줄 것입니다. 예를 들어, 720, 즉 반나절 정도입니다.

MySql의 경우:

GROUP BY
DATE(`your_date_field`),
HOUR(`your_date_field`),
FLOOR( MINUTE(`your_date_field`) / 10);

실제로 날짜를 표시하려면 변수 그룹을 설정하고 60분보다 큰 시간 프레임을 지정할 수 있습니다.

DECLARE @minutes int
SET @minutes = 90

SELECT
    DATEADD(MINUTE, DATEDIFF(MINUTE, 0, [Date]) / @minutes * @minutes, 0) as [Date],
    AVG([Value]) as [Value]
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY
    DATEDIFF(MINUTE, 0, [Date]) / @minutes
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)

SQLite에서 시간별로 그룹화하려면 다음 작업을 수행할 수 있습니다.

GROUP BY strftime('%H', [FRIIB].[dbo].[ArchiveAnalog].[Date]);

그리고 10분 단위로 그룹화합니다.

GROUP BY strftime('%M', [FRIIB].[dbo].[ArchiveAnalog].[Date]) / 10;

나의 해결책은 함수를 이용하여 날짜 간격으로 표를 작성한 후 이 표를 내가 그룹화하고 싶은 데이터에 표를 결합하는 것입니다.그러면 데이터를 표시할 때 날짜 간격을 쉽게 선택할 수 있습니다.

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

SQL Server 2012의 경우 SQL Server 2008R2에서 작동할 것으로 생각하지만 다음과 같은 접근 방식을 사용하여 시간을 밀리초로 단축합니다.

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

이 작업은 다음과 같습니다.

  • 고정 지점과 목표 시간 사이의 밀리초 수 가져오기:
    @ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
  • 밀리초를 타임슬라이스로 나누는 나머지 시간:
    @rms = @ms % @msPerSlice
  • 나머지의 음을 목표 시간에 추가하면 슬라이스 시간을 얻을 수 있습니다.
    DATEADD(MILLISECOND, -@rms, time)

불행하게도 마이크로초와 더 작은 단위로 넘쳐나므로 더 크고 더 미세한 데이터 세트는 덜 편리한 고정 지점을 사용해야 합니다.

저는 이를 엄격하게 벤치마킹하지 않았고 빅데이터를 사용하지 않기 때문에 귀사의 마일리지는 다양할 수 있습니다. 그러나 성능은 당사 장비 및 데이터 세트에서 시도한 다른 방법보다 크게 나쁘지 않았으며 임의 슬라이싱에 대한 개발자 편의성 지불로 인해 가치가 있습니다.

select dateadd(minute, datediff(minute, 0, Date), 0),
       sum(SnapShotValue)
FROM [FRIIB].[dbo].[ArchiveAnalog]
group by dateadd(minute, datediff(minute, 0, Date), 0)
select from_unixtime( 600 * ( unix_timestamp( [Date] ) % 600 ) ) AS RecT, avg(Value)
from [FRIIB].[dbo].[ArchiveAnalog]
group by RecT
order by RecT;

그룹화할 시간(초)만큼 두 개의 600을 교체합니다.

보관이라는 이름에서 알 수 있듯이 자주 필요하지만 테이블이 바뀌지 않는다면 날짜(및 시간)를 테이블의 유니트 타임으로 변환하여 저장하는 것이 좀 더 빠를 것입니다.

이것으로 쇼에 늦었다는 것을 알지만, 저는 이것을 사용했습니다 - 꽤 간단한 접근법.이렇게 하면 반올림 문제 없이 60분 분량의 조각을 얻을 수 있습니다.

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

이 쿼리를 사용해 보십시오.한 칸이 됩니다.(차이점 @madicilist answer)

GROUP BY CAST(DATE(`your_date_field`) as varchar) || ' ' || CAST(HOUR(`your_date_field`) as varchar) || ':' || CAST(FLOOR(minute(`your_date_field`) / 10) AS varchar) || '0' AS date_format

다음은 해당 간격(7:30, 7:40 등)의 사람이 읽을 수 있는 시작 시간을 제공하는 옵션입니다.

임시 테이블에서는 SMLDATETIME을 사용하여 초 단위 및 밀리초 단위로 잘라낸 다음, 주 쿼리에서 원하는 분 간격 동안의 양을 빼냅니다.

SELECT DATEADD(MINUTE, -(DATEDIFF(MINUTE, '2000', tmp.dt) % 10), tmp.dt)
FROM (
    SELECT CAST(DateField AS SMALLDATETIME) AS dt
    FROM MyDataTable
) tmp

한 줄의 코드로도 할 수 있지만 그만큼 가독성이 떨어집니다.

SELECT DATEADD(MINUTE, -(DATEDIFF(MINUTE, '2000', CAST(DateField AS SMALLDATETIME)) % 10), CAST(DateField AS SMALLDATETIME)) AS [interval] FROM MyDataTable

언급URL : https://stackoverflow.com/questions/5002661/how-can-i-group-time-by-hour-or-by-10-minutes

반응형