Tercihen, tabloyu saklamak için değiştirirdim datetime2
kıvrımlı dönem çöpü yerine değerler.
Ancak, tasarımı düzeltemeyeceğinizi varsayarsak...
Larnu'nun noktasına göre, hesaplamaları sütuna uygulamak istemezsiniz ve kesinlikle uygulamak istemezsiniz FORMAT()
her iki tarafa da çünküFORMAT()
mutlak bir köpektir.
Bunun yerine, bugün için sınırları bulup açık uçlu bir aralık kullanırdım. Bu varsayar TS
sütun olmalıdır 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;
Bu, biçimlendirme ek yükünü, kıvrık ve gereksiz dönüştürme ifadelerini önler (TS
zaten bir olmalı bigint
doğru, öyleyse neden açık CONVERT()
?).
Bitişik olmayan tarihlere ihtiyacınız varsa, tamam, bunu tablonun çok daha az kötüye kullanılmasıyla başarabiliriz. Hesaplanan sütunlarla bir #temp tablosu veya tablo değişkeni oluşturun, birden çok tarihinizi oraya ekleyin ve ardından dış birleşim yapın.
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;
Kötü alışkanlıklar ve en iyi uygulamalar hakkında çok daha fazlası: