โดยเฉพาะฉันจะเปลี่ยนแปลงที่โต๊ะเพื่อทำการจัดเก็บ datetime2
ค่าของแทนที่จะเป็น convoluted epoch มาตั้งแต่หกขวบ
แต่สันนิษฐานได้เลยว่าคุณไม่สามารถซ่อมออกแบบ...
ต้อง Larnu เป็นประเด็นคุณไม่ต้องการจะปรับใช้ computations ต้องคอลัมน์และคุณอย่างแน่นอนไม่ต้องการจะปรับใช้ 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;
นี่ avoids มีการฟอร์แมตอยู่เหนือศีรษะ,convoluted และไม่จำเป็นต้องทำแบแปลง/n(TS
ต้องเป็นอยู่แล้ว bigint
มาถูกทางแลว....ดังนันทำไมที่ explicit 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;
มีอีกมากมาในวันที่แย่นิสัย&ที่ดีที่สุดที่ฝึก: