Preferiblemente, me gustaría cambiar la tabla para almacenar datetime2
valores en lugar de la convulsionada época de la basura.
Pero, suponiendo que usted no puede arreglar el diseño...
A Larnu punto, usted no desea aplicar los cálculos de la columna, y definitivamente no desea aplicar FORMAT()
a ambos lados debido a que FORMAT()
es una absoluta perro.
En su lugar, me gustaría encontrar a los límites para el día de hoy, y el uso de un intervalo abierto. Esto supone la TS
la columna debe ser bigint
:
DECLARE @d date = GETDATE();
DECLARE @start bigint = DATEDIFF(SECOND, '19700101', @d),
@end bigint = DATEDIFF(SECOND, '19700101', DATEADD(DAY, 1, @d));
SELECT COUNT(*) AS c
FROM dbo.[TABLE]
WHERE TS >= @start * 1000
AND TS < @end * 1000;
Esto evita cualquier formato de sobrecarga, complicado e innecesario convertir expresiones (TS
ya debe ser un bigint
, a la derecha, así que ¿por qué el explícito CONVERT()
?).
Si usted necesita no contiguos fechas, ok, todavía podemos lograr esto con mucho menos abuso de la tabla. Sólo tienes que crear una tabla #temp o variable de tabla con columnas calculadas, insertar sus múltiples fechas en no y, a continuación, exterior unirse a ella.
DECLARE @d table
(
d datetime2,
s AS CONVERT(bigint,
DATEDIFF(SECOND, '19700101', d)) * 1000,
e AS CONVERT(bigint,
DATEDIFF(SECOND, '19700101', DATEADD(DAY, 1, d))) * 1000
);
INSERT @d(d) VALUES('20211123'),('20211007');
-- if you want a row per day:
SELECT d.d, COUNT(t.TS) AS c
FROM @d AS d
LEFT OUTER JOIN dbo.[TABLE] AS t
ON t.TS >= d.s
AND t.TS < d.e
GROUP BY d.d
ORDER BY d.d;
-- if you just want a total count:
SELECT COUNT(t.TS) AS c
FROM @d AS d
LEFT OUTER JOIN dbo.[TABLE] AS t
ON t.TS >= d.s
AND t.TS < d.e;
Mucho más en la fecha de los malos hábitos y las mejores prácticas: