2013-01-02 13 views

Odpowiedz

65

Stosować DATEDIFF

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

DateDiff należy obchodzić się ostrożnie. Jeśli zależy ci na kilku godzinach, to cię zawiedzie. 11 PM na 1AM to "1 dzień" zgodnie z DateDiff. Nie używaj go, jeśli widzisz dni jako "liczbę 24-godzinnych okresów". – Pxtl

+0

@Pxtl czy istnieje funkcja w SQL, która również bierze pod uwagę czas? –

+0

Nie o tym wiem. – Pxtl

7

użytku DATE_DIFF

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

EDIT: Wydaje się myliłem o spektaklu na przykładzie kodu. Najlepszym wykonawcą jest ten drugi fragment, który występuje jako drugi. Dowodzi to, co starałem się wyjaśnić, a różnice czasowe nie są tak dramatyczne:

---------------------------------- 
-- 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()) 

Przepraszam za komentarz późno i moja grubsza skomentował przykład, ale myślę, że ważne jest, aby wspomnieć SARG.

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

Chociaż tabeli temp w poniższym kodzie nie ma indeksu, wydajność jest jeszcze wzmocniona przez fakt, że porównanie jest wykonywana między wyrazem a wartością w tabeli, a nie wyraz, który modyfikuje wartość w tabela i stała. Mam nadzieję, że okaże się to przydatne.

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

dziękuję za informacje! –

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

Jak o

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 jest nazwa kolumny.

wynik:

DiffDate

+0

Dlaczego dodawanie odpowiedzi, która nie dodaje żadnych informacji do innych odpowiedzi w poście? –

+0

To nie jest odpowiedź, to nie dodaje/wyjaśnia/poprawia itp. Coś do istniejących asnwers –