2013-01-02 7 views

risposta

65

Utilizzare DATEDIFF

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

DateDiff deve essere maneggiato con cura. Se ti preoccupi di ore, ti mancherà. 11PM a 1AM è "1 giorno" secondo DateDiff. Non usarlo se vedi giorni come "numero di periodi di 24 ore". – Pxtl

+0

@Pxtl esiste una funzione in SQL che consideri anche l'ora? –

+0

Non che io sappia. – Pxtl

7

uso DATE_DIFF

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

EDIT: Sembra che mi sbagliavo circa le prestazioni nell'esempio di codice. Il migliore interprete è il secondo snippet nel caso registrato. Questo dimostra quello che stavo cercando di spiegare, e le differenze di tempo non sono così drammatiche:

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

Mi scusi per la pubblicazione di ritardo e il mio esempio rozzamente commentato, ma penso che sia importante menzionare SARG.

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

Sebbene la tabella temporanea nel seguente codice non ha un indice, il rendimento è ancora aumentata dal fatto che il confronto è fatto tra un'espressione e un valore nella tabella e non un'espressione che modifica il valore in il tavolo e una costante. Spero che questo sia utile.

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

grazie per l'informazione! –

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

Come su

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 è il nome della colonna.

risultato:

DiffDate

+0

Perché aggiungere una risposta che non aggiunge alcuna informazione alle altre risposte nel post? –

+0

Questa non è la risposta, non aggiunge/spiega/corregge ecc. Qualcosa ai precedenti asnwers –

Problemi correlati