अधिमानतः, मैं बदल जाएगा तालिका स्टोर करने के लिए 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()
?).
अगर आप की जरूरत है गैर-निरंतर दिन, ठीक है, हम कर सकते हैं अभी भी यह पूरा करने के साथ अब तक कम दुरुपयोग करने के लिए नहीं । बस बनाने के लिए एक अस्थायी तालिका या तालिका चर के साथ परिकलित स्तंभों को सम्मिलित करते हैं, अपने कई तिथियों में वहाँ है, और फिर बाहरी में शामिल होने के लिए ।
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;
बहुत अधिक पर तारीख बुरी आदतों और सर्वोत्तम प्रथाओं: