De preferință, mi-ar schimba tabelul de la magazin datetime2
valori în loc de complicate epoca nedorite.
Dar, presupunând că nu se poate repara design...
Pentru a Larnu punct, nu vreau să aplice calculele la coloană, și tu cu siguranță nu vreau să se aplice FORMAT()
pentru ambele părți, deoarece FORMAT()
este un câine absolut.
În schimb, mi-ar găsi limitele de astăzi, și de a folosi un deschise gama. Asta presupune TS
coloana trebuie să fie 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;
Acest lucru evită orice formatare deasupra capului, complicate și inutile converti expresii (TS
trebuie să fie deja un bigint
, așa că de ce explicite CONVERT()
?).
Dacă ai nevoie de non-contigue de date, ok, încă putem realiza acest lucru cu mult mai puțin abuz de masă. Doar a crea un #temp masă sau masă variabilă cu computerizata coloane, introduceți mai multe date într-acolo, și apoi exterior adere la ea.
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;
Mai multe pe data de obiceiurile proaste si cele mai bune practici: