como cuando lo hago
SELECT [Date]
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY [Date]
¿Cómo puedo especificar el período del grupo?
MS SQL 2008
2da Edición
Lo estoy intentando
SELECT MIN([Date]) AS RecT, AVG(Value)
FROM [FRIIB].[dbo].[ArchiveAnalog]
GROUP BY (DATEPART(MINUTE, [Date]) / 10)
ORDER BY RecT
cambió% 10 a / 10. ¿es posible hacer una salida de Fecha sin milisegundos?
ROUND((DATEPART(MINUTE, DT.[Date]) / 5),0,1) * 5
, de modo que cuando miro los datos se correlaciona con el intervalo de tiempo más cercanoDATE(DT.[Date])
.datepart(hour, workingPolicy.workingHours)/2.0
da1.5
mientrasdatepart(hour, '1900-01-01 09:00:30.000')/2.0
da4.5
, no entiendo por qué? Nota: workingPolicy.workingHours = 1900-01-01 09: 00: 30.000 . por favor ayudaLlego muy tarde a la fiesta, pero esto no aparece en ninguna de las respuestas existentes:
10
yMINUTE
se pueden cambiar a cualquier número yDATEPART
, respectivamente.DATETIME
valor, lo que significa:SELECT
declaración le dará a su salida una columna con una salida bonita truncada en el nivel que especifique.'2000'
es una "fecha de anclaje" alrededor de la cual SQL realizará la matemática de fecha. Jereonh descubrió a continuación que encuentra un desbordamiento de enteros con el ancla anterior (0
) cuando agrupa fechas recientes por segundos o milisegundos. †Si sus datos abarcan siglos, ‡ el uso de una sola fecha de anclaje para la agrupación de segundos o milisegundos seguirá encontrando el desbordamiento. Si eso sucede, puede pedirle a cada fila que ancle la comparación de agrupación a la medianoche de su propia fecha:
Use en
DATEADD(DAY, DATEDIFF(DAY, 0, aa.[date]), 0)
lugar de'2000'
donde aparezca arriba. Su consulta será totalmente ilegible, pero funcionará.Una alternativa podría ser
CONVERT(DATETIME, CONVERT(DATE, aa.[date]))
el reemplazo.† 2 32 ≈ 4.29E + 9, por lo que si
DATEPART
es asíSECOND
, obtendrá 4.300 millones de segundos a cada lado o "ancla ± 136 años". Del mismo modo, 2 32 milisegundos es ≈ 49.7 días.‡ Si sus datos realmente abarcan siglos o milenios y aún son precisos al segundo o milisegundo ... ¡felicidades! Lo que sea que estés haciendo, sigue haciéndolo.
fuente
where
cláusula antes delgroup by
./ 20 * 20
sería lo mismo que recopilar datos para intervalos de 20 minutos? Lo siento, estoy luchando con las matemáticas en este momento.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 es la parte de fecha más pequeña que puede usar con este enfoque.0
a'2000'
(¡las comillas son importantes!) e intenteSECOND
nuevamente.En T-SQL puedes:
o
por minuto de uso
DATEPART(mi, [Date])
o
por 10 minutos de uso
DATEPART(mi, [Date]) / 10
(como sugirió Timothy)fuente
Por un intervalo de 10 minutos, usted
Como ya lo mencionaron tzup y Pieter888 ... para hacer un intervalo de una hora, solo
fuente
Debería ser algo como
(No estoy 100% seguro de la sintaxis, soy más un tipo de Oracle)
En oráculo:
fuente
La respuesta original que el autor dio funciona bastante bien. Solo para extender esta idea, puedes hacer algo como
lo que le permitirá agrupar por un período más largo de 60 minutos, digamos 720, que es medio día, etc.
fuente
Para MySql:
fuente
Mi solución es usar una función para crear una tabla con los intervalos de fechas y luego unir esta tabla a los datos que quiero agrupar usando el intervalo de fechas en la tabla. El intervalo de fecha se puede seleccionar fácilmente al presentar los datos.
fuente
fuente
Para SQL Server 2012, aunque creo que funcionaría en SQL Server 2008R2, utilizo el siguiente enfoque para reducir el tiempo al milisegundo:
Esto funciona por:
@ms = DATEDIFF(MILLISECOND, CAST(time AS DATE), time)
@rms = @ms % @msPerSlice
DATEADD(MILLISECOND, -@rms, time)
Desafortunadamente, como esto se desborda con microsegundos y unidades más pequeñas, los conjuntos de datos más grandes y finos necesitarían usar un punto fijo menos conveniente.
No he comparado rigurosamente esto y no estoy en big data, por lo que su kilometraje puede variar, pero el rendimiento no fue notablemente peor que los otros métodos probados en nuestros equipos y conjuntos de datos, y el pago en conveniencia del desarrollador para el corte arbitrario hace que valga la pena. para nosotros.
fuente
reemplace los dos 600 por cualquier número de segundos que desee agrupar.
Si necesita esto con frecuencia y la tabla no cambia, como sugiere el nombre Archive, probablemente sería un poco más rápido convertir y almacenar la fecha (y hora) como unimextime en la tabla.
fuente
Sé que llego tarde al show con este, pero usé esto, un enfoque bastante simple. Esto le permite obtener los cortes de 60 minutos sin problemas de redondeo.
fuente
fuente