2013-10-11 198 views
0

我正在浏览前任编写的脚本。在t-sql中减去两个日期

有人能向我解释为什么会有这种说法

--- CreatedDateTime is a datetime column in SALES_ORDER table. 
SELECT * FROM SALES_ORDER 
WHERE GETDATE() - CreatedDateTime < 1 

返回相同的结果

SELECT * FROM SALES_ORDER 
WHERE DateDiff(hh,CreatedDateTime, GetDate()) < 24 
+0

因为1天等于24小时 –

+0

我想那么多。但我无法找到任何文件。日期时间值之间的减法结果是日期时间值。在这种情况下,它如何评估/比较为“1天”?铸件? –

回答

1

两个布尔表达式评价同一件事。无论是24小时还是1天。顺便提一句,它们都不包括CreatedDateTime列中索引的使用情况。

SELECT * FROM SALES_ORDER 
    WHERE CreatedDateTime > GETDATE() - 1 

或本(小于一日龄):

SELECT * FROM SALES_ORDER 
    WHERE CreatedDateTime > DateAdd(dd,-1,GetDate()) 
如果你有此列的索引,想提高它的使用那么十有八九你会更喜欢这样写

或该(小于86400000毫秒旧旧):

SELECT * FROM SALES_ORDER 
    WHERE CreatedDateTime > DateAdd(ms,-86400000,GetDate()) 
3

一个DATETIME一个的减法是记录here:“也可以从日期中减去一个数字,以天为单位。”

declare @Now as DateTime = GetDate(); 
declare @OneWeekAgo as SQL_Variant = @Now - 7; 

select @Now as [Now], @OneWeekAgo as [Delta], SQL_Variant_Property(@OneWeekAgo, 'BaseType') as [Data Type]; 

Using Operators with Date and Time Data Types:“加减法用于所有日期和时间数据类型,使用DATEADD和DATEDIFF。”

在可能的违规行为,我们看到下面的好奇结果Principle of Least Astonishment的:

declare @Now as DateTime = GetDate(); 
declare @Then as DateTime = '17760704'; 
declare @Delta as SQL_Variant = @Now - @Then; 

select @Now as [Now], @Then as [Then], @Delta as [Delta], 
    SQL_Variant_Property(@Delta, 'BaseType') as [Data Type], 
    Cast(@Delta as Int) as [Days]; 

阿龙贝特朗条款:所提供的信息是由阿龙贝特朗未经批准。此外,作者未能指出在任何特定环境下可能不适用或不理想的所有可能方式,无论这些方式多么模糊或人为设计。作者还犯了基数和/或序数罪,没有明确提及Aaron Bertrand的博客文章至少三(3)个标准答案。因此它不会给整个社区带来任何好处,作者应立即永久地从所有StackExchange站点放逐,并且作者提供的任何内容都应从中删除。微软精彩的文档可能导致任何(错误)理解的程度并不重要。

+0

让我发笑的+1 – UnhandledExcepSean

+0

我大声说笑,直到我滑倒,不小心关闭了我的所有亚伦伯特兰博客。 –

+2

什么.....? –