내가 할 때처럼
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으로 변경했습니다. 밀리 초없이 날짜를 출력 할 수 있습니까?
답변
마지막으로 완료
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 DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', date_column) / 10 * 10, '2000')
10
및MINUTE
조건은 임의의 숫자로 변경 될 수 있습니다DATEPART
각각.- 이는
DATETIME
값 을 의미합니다.- 오랜 시간 간격으로 잘 작동합니다. (연도간에 충돌이 없습니다.)
SELECT
명령문에 포함 시키면 출력이 지정한 레벨에서 잘린 출력 열이 제공됩니다.
'2000'
SQL이 날짜 계산을 수행 할 “고정 날짜”입니다. Jereonh 는0
최근 날짜를 초 또는 밀리 초 단위로 그룹화 할 때 이전 앵커 ( ) 에서 정수 오버플로가 발생한다는 것을 발견했습니다 . †
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
GROUP BY DATEADD(MINUTE, DATEDIFF(MINUTE, '2000', aa.[date]) / 10 * 10, '2000')
ORDER BY [date_truncated]
데이터가 수 세기에 걸쳐있는 경우 ‡ 초 또는 밀리 초 그룹화에 단일 앵커 날짜를 사용하면 여전히 오버플로가 발생합니다. 이 경우 각 행에 비닝 비교를 해당 날짜의 자정에 고정하도록 요청할 수 있습니다.
-
위에 나타난 곳
DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
대신에 사용하십시오'2000'
. 쿼리를 완전히 읽을 수는 없지만 작동합니다. -
대안이 대안이 될 수 있습니다
CONVERT(DATETIME, CONVERT(DATE, aa.[date]))
.
† 이 32 ≈ 4.29E + 9, 그래서 당신의 경우 DATEPART
IS SECOND
, 당신은 양쪽에 43억초를 얻을, 또는 “앵커 ± 1백36년.” 마찬가지로 2 32 밀리 초는 9.7 49.7 일입니다.
‡ 데이터가 실제로 수세기 또는 백만년에 걸쳐 있고 여전히 초 또는 밀리 초 까지 정확하다면… 축하합니다! 당신이 무엇을 하든지 계속하십시오.
답변
T-SQL에서는 다음을 수행 할 수 있습니다.
SELECT [Date]
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY [Date], DATEPART(hh, [Date])
또는
분 단위로 DATEPART(mi, [Date])
또는
10 분 사용 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에서 :
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);