Prednostne by som zmeniť tabuľke store datetime2
hodnoty namiesto spletitý doby nevyžiadanej pošty.
Ale, za predpokladu, že si nemôžete opraviť dizajn...
Na Larnu je bod, nechcete aplikovať výpočty na stĺpec, a určite nechcú, aby sa vzťahujú FORMAT()
na oboch stranách, pretože FORMAT()
je absolútne psa.
Namiesto toho, by som nájsť hranice pre dnes, a používanie otvoreného rozsahu. To predpokladá, že TS
stĺpec musí byť 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;
Tým sa zabráni akékoľvek formátovanie réžii, spletitý a zbytočné previesť výrazy (TS
už musí byť bigint
, právo, tak prečo explicitné CONVERT()
?).
Ak potrebujete nesúvislých dátumy, ok, ešte môžeme dosiahnuť s ďaleko menej zneužívania tabuľky. Stačí vytvoriť #temp tabuľku alebo premenná s vypočítané stĺpce, vložte vaše viaceré dátumy tam, a potom vonkajšie pripojiť sa k nej.
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;
Veľa viac na dátum zlé návyky & najlepších postupov: