시간대별 또는 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
와 함께HOUR
6시간 간격입니다.
구간을 많이 변경하면 변수로 선언하여 이득을 볼 수 있습니다.
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
아래 굵은 부분과 함께:
각 타임스탬프가 간격의 반과 간격의 반을 나타내도록 간격을 안쪽으로 반올림하려면 다음과 같은 방법을 사용합니다.
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시간 빈으로 그룹화하는 경우 일부는 건너뜁니다.:00
s, 그래도 잘 될 겁니다.
수학은 2 ≈ 4.29E+9라고 합니다.이것은 a를 의미합니다.DATEPART
SECOND
, 어느 쪽이든 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
'source' 카테고리의 다른 글
요소의 올바른 오프셋을 구하는 방법은? - jQuery (0) | 2023.09.09 |
---|---|
성공적으로 로그인한 후 스프링 부트가 현재 페이지로 리디렉션됨 (0) | 2023.09.09 |
팬더 데이터 프레임을 인덱스별로 정렬하는 방법은? (0) | 2023.09.09 |
사용자가 브라우저 기록으로 돌아갈 수 있는지 여부를 확인하는 방법 (0) | 2023.09.09 |
고유 색인 또는 고유 키? (0) | 2023.09.09 |