바람직하게,나는 변경을 저장하는 테이블 datetime2
대신 값의 복잡한 epoch 니다.
하지만 가정하면,당신이 해결할 수 없는 디자인...
을 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()
?).
필요한 경우 연속되지 않 날짜,확인,우리는 여전히 이를 위해 훨씬 적은 남용의 테이블. 들#temp 테이블 또는 테이블이 변수로 계산된 열 삽입하고 여러 날짜가 있습니다,그리고 그런 다음 외부에 가입니다.
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;
더 많은 날짜에 나쁜 습관&best practices: