在SQL中减去两个日期并获得结果的天数

Bon*_*Kun 39 sql t-sql sql-server

Select I.Fee
From Item I
WHERE GETDATE() - I.DateCreated < 365 days
Run Code Online (Sandbox Code Playgroud)

我该如何减去两天?结果应该是天.例如:365天.500天......等等......

Hab*_*bib 71

使用DATEDIFF

Select I.Fee
From Item I
WHERE  DATEDIFF(day, GETDATE(), I.DateCreated) < 365
Run Code Online (Sandbox Code Playgroud)

  • 必须小心处理DateDiff.如果你关心时间,它会让你失望.根据DateDiff,晚上11点到凌晨1点是"1天".如果您将天数视为"24小时数",请不要使用它. (4认同)

Joh*_*Woo 8

使用 DATE_DIFF

Select I.Fee
From   Item I
WHERE  DATEDIFF(day, GETDATE(), I.DateCreated)  < 365
Run Code Online (Sandbox Code Playgroud)


Mar*_*rkD 7

编辑:似乎我错误的代码示例的性能.表现最佳的是在发布的案例中以秒为单位的片段.这说明了我试图解释的内容,时间差异并不那么显着:

----------------------------------
--  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())
Run Code Online (Sandbox Code Playgroud)

请原谅我迟到和我粗略评论的例子,但我认为提到SARG很重要.

SELECT I.Fee
FROM Item I
WHERE  I.DateCreated > DATEADD(DAY, -364, GETDATE())
Run Code Online (Sandbox Code Playgroud)

虽然下面代码中的临时表没有索引,但是通过在表中的表达式和值之间进行比较而不是修改表中的值和常量的表达式,性能仍然得到提高.希望这被发现是有用的.

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())
Run Code Online (Sandbox Code Playgroud)