2013-01-02 9 views

उत्तर

65

उपयोग DATEDIFF

Select I.Fee 
From Item I 
WHERE DATEDIFF(day, GETDATE(), I.DateCreated) < 365 
+4

DateDiff देखभाल के साथ संभाला जाना चाहिए। यदि आपको घंटों की परवाह है, तो यह आपको असफल कर देगा। डेटडिफ के अनुसार 11 पीएम से 1AM "1 दिन" है। यदि आप दिनों को "24 घंटे की अवधि" के रूप में देखते हैं तो इसका उपयोग न करें। – Pxtl

+0

@Pxtl एसक्यूएल में एक समारोह है जो समय को भी मानता है? –

+0

मुझे नहीं पता कि। – Pxtl

7

उपयोग DATE_DIFF

Select I.Fee 
From Item I 
WHERE DATEDIFF(day, GETDATE(), I.DateCreated) < 365 
6

संपादित करें: ऐसा लगता है मैं प्रदर्शन के बारे में गलत था कोड उदाहरण पर। सबसे अच्छा कलाकार जो भी पोस्ट स्नैपेट पोस्ट किए गए मामले में दूसरे स्थान पर चलता है। यह दर्शाता है कि मैं क्या समझाने की कोशिश कर रहा था, और समय मतभेद के रूप में नाटकीय नहीं हैं:

---------------------------------- 
-- Monitor time differences 
---------------------------------- 
CREATE CLUSTERED INDEX dtIDX ON #ArbDates (MyDate) 
DECLARE @Stopwatch DATETIME 
SET @Stopwatch = GETDATE() 
    -- SARGABLE 
    SELECT * 
    FROM #ArbDates 
    WHERE MyDate > DATEADD(DAY, -364, '2010-01-01') 


PRINT DATEDIFF(MS, @Stopwatch, GETDATE()) 
SET @Stopwatch = GETDATE() 
    -- NOT SARGABLE 
    SELECT * 
    FROM #ArbDates 
    WHERE DATEDIFF(DAY, MyDate, '2010-01-01') < 365 
PRINT DATEDIFF(MS, @Stopwatch, GETDATE()) 

देर पोस्टिंग और मेरे कुदरती तौर से टिप्पणी की, उदाहरण के लिए मुझे माफ करना, लेकिन मुझे लगता है कि यह महत्वपूर्ण SARG उल्लेख करने के लिए।

SELECT I.Fee 
FROM Item I 
WHERE I.DateCreated > DATEADD(DAY, -364, GETDATE()) 

हालांकि नीचे कोड में अस्थायी तालिका कोई सूचक है, प्रदर्शन अभी भी तथ्य यह है कि एक तुलना एक अभिव्यक्ति है और तालिका में एक मूल्य है और एक अभिव्यक्ति है कि में मूल्य को संशोधित करता है के बीच किया जाता है से बढ़ जाती है टेबल और एक स्थिर। उम्मीद है कि यह उपयोगी पाया जा सकता है।

USE tempdb 
GO 

IF OBJECT_ID('tempdb.dbo.#ArbDates') IS NOT NULL DROP TABLE #ArbDates 
DECLARE @Stopwatch DATETIME 

---------------------------------- 
-- Build test data: 100000 rows 
---------------------------------- 
;WITH Base10 (n) AS 
(
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 UNION ALL SELECT 1 UNION ALL SELECT 1 UNION ALL 
    SELECT 1 
) 
,Base100000 (n) AS 
(
    SELECT 1 
    FROM Base10 T1, Base10 T3, Base10 T4, Base10 T5, Base10 T6 
) 
SELECT MyDate = CAST(RAND(CHECKSUM(NEWID()))*3653.0+36524.0 AS DATETIME) 
INTO #ArbDates 
FROM Base100000 

---------------------------------- 
-- Monitor time differences 
---------------------------------- 
SET @Stopwatch = GETDATE() 

    -- NOT SARGABLE 
    SELECT * 
    FROM #ArbDates 
    WHERE DATEDIFF(DAY, MyDate, '2010-01-01') < 365 

PRINT DATEDIFF(MS, @Stopwatch, GETDATE()) 
SET @Stopwatch = GETDATE() 

    -- SARGABLE 
    SELECT * 
    FROM #ArbDates 
    WHERE MyDate > DATEADD(DAY, -364, '2010-01-01') 

PRINT DATEDIFF(MS, @Stopwatch, GETDATE()) 
+0

में दूसरे तर्क के रूप में 'GetDate' को जानकारी के लिए धन्यवाद! –

0
SELECT (to_date('02-JAN-2013') - to_date('02-JAN-2012')) days_between 
FROM dual 
/
1

कैसे के बारे में

Select I.Fee 
From Item I 
WHERE (days(GETDATE()) - days(I.DateCreated) < 365) 
0
SELECT DATEDIFF(day,'2014-06-05','2014-08-05') AS DiffDate 

diffdate स्तंभ नाम है।

परिणाम:

DiffDate

+0

एक ऐसा उत्तर क्यों जोड़ रहा है जो पोस्ट में अन्य उत्तरों में कोई जानकारी नहीं जोड़ता है? –

+0

यह उत्तर नहीं है, यह मौजूदा asnwers के लिए कुछ जोड़/व्याख्या/सही आदि नहीं है –