Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL中减去两个日期,得到结果的天数_Sql_Sql Server_Tsql - Fatal编程技术网

在SQL中减去两个日期,得到结果的天数

在SQL中减去两个日期,得到结果的天数,sql,sql-server,tsql,Sql,Sql Server,Tsql,我怎样才能减去两天?结果应该是天。例:365天。500天。。等等。使用 使用日期差异 编辑: 似乎我对代码示例的性能的看法是错误的。 最好的执行者是发布案例中第二个运行的代码段。 这表明了我试图解释的内容,时间差异并没有那么显著: Select I.Fee From Item I WHERE DATEDIFF(day, GETDATE(), I.DateCreated) < 365 尽管下面代码中的temp表没有索引,但性能仍然得到了提高,因为在表达式和表中的值之间进行了比较,而

我怎样才能减去两天?结果应该是天。例:365天。500天。。等等。

使用

使用日期差异

编辑: 似乎我对代码示例的性能的看法是错误的。 最好的执行者是发布案例中第二个运行的代码段。 这表明了我试图解释的内容,时间差异并没有那么显著:

Select I.Fee
From   Item I
WHERE  DATEDIFF(day, GETDATE(), I.DateCreated)  < 365
尽管下面代码中的temp表没有索引,但性能仍然得到了提高,因为在表达式和表中的值之间进行了比较,而不是在修改表中的值和常量的表达式之间进行比较。 希望这是有用的

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

SELECT (to_date('02-JAN-2013') - to_date('02-JAN-2012')) days_between
FROM dual
/
diffdate是列名

结果:

扩散

23语法

expr1,expr2

描述

DATEDIFF返回expr1–expr2,以从一个日期到另一个日期的天数表示。expr1和expr2是日期或日期和时间表达式。计算中仅使用值的日期部分


@D Stanley

为什么要在帖子中添加一个答案,而不是在其他答案中添加任何信息?这不是答案,它不会添加/解释/更正等。必须小心处理现有asnwersDateDiff中的某些内容。如果你在乎时间,它会让你失望。根据DateDiff,晚上11点到凌晨1点是一天。如果您将天视为24小时周期数,请不要使用它。@Pxtl SQL中是否有一个函数也考虑了时间?据我所知不是这样。不知道为什么没有人注意到该查询在技术上是不正确的。where子句中的表达式总是在DateDiff变为负数时为true。请注意复制此解决方案并将GetDate作为DateDiffTip中的第二个参数:
----------------------------------
--  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())
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())
SELECT (to_date('02-JAN-2013') - to_date('02-JAN-2012')) days_between
FROM dual
/
Select I.Fee
From Item I
WHERE  (days(GETDATE()) - days(I.DateCreated) < 365)
SELECT DATEDIFF(day,'2014-06-05','2014-08-05') AS DiffDate