como quando eu faço
SELECT [Date]
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY [Date]
como posso especificar o período do grupo?
MS SQL 2008
2ª Edição
estou tentando
SELECT MIN([Date]) AS RecT, AVG(Value)
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY (DATEPART(MINUTE, [Date]) / 10)
ORDER BY RecT
mudou% 10 para / 10. é possível gerar saída de data sem milissegundos?
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
, de modo que quando eu olhar para os dados que está correlacionada com a ranhura mais próxima vezDATE(DT.[Date])
.datepart(hour, workingPolicy.workingHours)/2.0
dá1.5
enquantodatepart(hour, '1900-01-01 09:00:30.000')/2.0
dá4.5
, não entendo o porquê? Nota: workingPolicy.workingHours = 1900-01-01 09: 00: 30.000 . Por favor, ajudeEstou muito atrasado para a festa, mas isso não aparece em nenhuma das respostas existentes:
10
eMINUTE
podem ser alterados para qualquer número eDATEPART
, respectivamente.DATETIME
valor, o que significa:SELECT
declaração fornecerá à sua saída uma coluna com uma saída bonita truncada no nível que você especificar.'2000'
é uma "data âncora" em torno da qual o SQL executará a matemática da data. Jereonh descobriu abaixo que você encontra um estouro de número inteiro com a âncora anterior (0
) ao agrupar datas recentes por segundos ou milissegundos. †Se seus dados se estenderem por séculos, ‡ usando uma única data de ancoragem para o agrupamento de segundo ou milissegundo ainda encontrará o estouro. Se isso estiver acontecendo, você pode solicitar a cada linha que ancore a comparação de classificação na meia-noite da sua própria data:
Use em
DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
vez de'2000'
onde quer que apareça acima. Sua consulta será totalmente ilegível, mas funcionará.Uma alternativa pode ser
CONVERT(DATETIME, CONVERT(DATE, aa.[date]))
a substituição.† 2 32 ≈ 4,29E + 9, portanto, se
DATEPART
forSECOND
, você recebe 4,3 bilhões de segundos de cada lado, ou "ancora ± 136 anos". Da mesma forma, 2 32 milissegundos é de ≈ 49,7 dias.‡ Se os seus dados ultrapassam séculos ou milênios e ainda são precisos até o segundo ou milissegundo ... parabéns! O que quer que você esteja fazendo, continue fazendo.
fonte
where
cláusula antes dogroup by
./ 20 * 20
seria o mesmo que coletar dados para intervalos de 20 minutos? Desculpe, estou com dificuldades em matemática agora.The datediff function resulted in an overflow. The number of dateparts separating two date/time instances is too large. Try to use datediff with a less precise datepart.
). Parece que MINUTE é o menor período que você pode usar com essa abordagem.0
para'2000'
(aspas são importantes!) e tenteSECOND
novamente.No T-SQL, você pode:
ou
por minuto de uso
DATEPART(mi, [Date])
ou
por 10 minutos de uso
DATEPART(mi, [Date]) / 10
(como sugeriu Timothy)fonte
Por um intervalo de 10 minutos, você
Como já foi mencionado por tzup e Pieter888 ... para fazer um intervalo de horas, apenas
fonte
Deve ser algo como
(Não tenho 100% de certeza sobre a sintaxe - sou mais um cara do tipo Oracle)
No Oracle:
fonte
A resposta original que o autor deu funciona muito bem. Só para estender essa ideia, você pode fazer algo como
o que permitirá que você agrupe por um período mais longo do que 60 minutos, por exemplo, 720, que é meio dia etc.
fonte
Para o MySql:
fonte
Minha solução é usar uma função para criar uma tabela com os intervalos de datas e associá-la aos dados que eu quero agrupar usando o intervalo de datas na tabela. O intervalo de datas pode ser facilmente selecionado ao apresentar os dados.
fonte
fonte
Para o SQL Server 2012, embora eu acredite que funcionaria no SQL Server 2008R2, uso a seguinte abordagem para reduzir o tempo de milissegundos:
Isso funciona por:
@ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
@rms = @ms % @msPerSlice
DATEADD(MILLISECOND, -@rms, time)
Infelizmente, como isso transborda em microssegundos e unidades menores, conjuntos de dados maiores e mais precisos precisariam usar um ponto fixo menos conveniente.
Não comparei rigorosamente isso e não estou no big data, portanto sua milhagem pode variar, mas o desempenho não foi notavelmente pior do que os outros métodos testados em nossos equipamentos e conjuntos de dados, e o pagamento na conveniência do desenvolvedor por fatias arbitrárias vale a pena para nós.
fonte
substitua os dois 600 por qualquer número de segundos que você deseja agrupar.
Se você precisar disso com frequência e a tabela não mudar, como o nome Archive sugere, provavelmente seria um pouco mais rápido converter e armazenar a data (e hora) como um tempo unix na tabela.
fonte
Eu sei que estou atrasado para o show com este, mas eu usei isso - uma abordagem bem simples. Isso permite que você obtenha as fatias de 60 minutos sem problemas de arredondamento.
fonte
fonte