好的,我会改变的表来存储 datetime2
值,而不是复杂的划时代的垃圾。
但是,假设你不能修复的设计...
到Larnu点,你不想要应用计算,以分列,和你肯定不想要应用 FORMAT()
双方因为 FORMAT()
是一个绝对的狗.
相反,我会找到边界的今天,使用一个不限成员名额的范围。 这个假设 TS
列必须 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;
这样可以避免的任何格式的开销,令人费解和不必要的转换表(TS
必须已经被一个 bigint
,正确的,那么,为什么明确 CONVERT()
?).
如果你需要的非连续的日期确定,我们仍然可以完成这远远少滥用的表格。 只要创建一个#临时表或表变量计算列入的多种日期,在那里,然后外加入它。
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;
更多关于日期的不良生活习惯和最佳做法: