在SQL中减去两个日期,得到结果的天数
我怎样才能减去两天?结果应该是天。例:365天。500天。。等等。使用 使用日期差异 编辑: 似乎我对代码示例的性能的看法是错误的。 最好的执行者是发布案例中第二个运行的代码段。 这表明了我试图解释的内容,时间差异并没有那么显著:在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表没有索引,但性能仍然得到了提高,因为在表达式和表中的值之间进行了比较,而
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