वे समकक्ष नहीं हैं। रिकॉर्ड जो 7 दिन पहले के हैं, लेकिन दिन के वर्तमान समय से पहले - केवल क्वेरी # 2 में वापस कर दिए जाएंगे:
DATEADD
फ़ंक्शन का उपयोग करते हुए दिनों की तुलना करते समय , यह समय के भाग को ध्यान में नहीं रखता है । रविवार और सोमवार की तुलना करते समय फ़ंक्शन 1 वापस आ जाएगा, समय की परवाह किए बिना।
डेमो:
DECLARE @MyTable TABLE(pk INT, LogInsertTime DATETIME);
INSERT @MyTable
VALUES (1, DATEADD(HOUR, 1, CAST(DATEADD(DAY, -7, CAST (GETDATE() AS DATE))AS DATETIME))),
(2, DATEADD(HOUR, 23, CAST(DATEADD(DAY, -7, CAST (GETDATE() AS DATE)) AS DATETIME)));
DECLARE @DateTime DATETIME = GETDATE();
SELECT *
FROM @MyTable
WHERE DATEDIFF(DAY, LogInsertTime, @DateTime) > 7;
-- 0 records.
SELECT *
FROM @MyTable
WHERE LogInsertTime < @DateTime - 7;
-- 1 record.
पहली क्वेरी का तार्किक समतुल्य जो संभावित अनुक्रमणिका उपयोग को सक्षम करेगा, या तो समय के भाग को हटाने @DateTime
या समय निर्धारित करने के लिए है 0:00:00
:
SELECT *
FROM @MyTable
WHERE LogInsertTime < CAST(@DateTime - 7 AS DATE);
पहली क्वेरी किसी सूचकांक का उपयोग नहीं कर पाने LogInsertTime
का कारण यह है कि कॉलम किसी फ़ंक्शन के भीतर दफन है। क्वेरी # 2 कॉलम की तुलना निरंतर मान से करता है जो ऑप्टिमाइज़र को एक इंडेक्स चुनने में सक्षम बनाता है LogInsertTime
।
LogInsertTime
है?