Preferibilmente, vorrei cambiare la tabella per memorizzare datetime2
i valori invece di contorto epoca spazzatura.
Ma, ammesso che non è possibile risolvere il design...
Per Larnu punto, non si desidera applicare i calcoli in colonna, e sicuramente non si desidera applicare FORMAT()
per entrambe le parti in quanto FORMAT()
è un assoluto cane.
Invece, vorrei trovare i confini di oggi, e l'uso di un open-ended gamma. Questo presuppone che il TS
la colonna deve essere 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;
Questo evita qualsiasi tipo di formattazione overhead, contorto e inutili convertire espressioni (TS
deve essere già un bigint
, a destra, allora, perché l'esplicito CONVERT()
?).
Se hai bisogno di non contigue date, ok, possiamo tuttavia fare questo con molto meno di abuso del tavolo. Basta creare una tabella #temp o una variabile di tabella con le colonne calcolate, inserisci la tua più date in là, e poi join esterno ad esso.
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;
Un sacco di più sulla data di cattive abitudini e buone pratiche: