0

我正在浏览一个前任写的剧本。

有人可以向我解释为什么会这样声明

--- 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
4

2 回答 2

3

此处记录了从 DATETIME 中减去数字:“也可以从日期中减去以天为单位的数字。”

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];

对日期和时间数据类型使用运算符下:“要对所有日期和时间数据类型进行加减运算,请使用 DATEADD 和 DATEDIFF。”

在可能违反最小惊讶原则的情况下,我们看到以下奇怪的结果:

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 条款:所提供的信息未经 Aaron Bertrand 批准。此外,作者未能指出在任何给定环境中它可能不适用或不是最佳的所有可能方式,无论多么晦涩或人为。作者还犯了未能明确引用至少三 (3) 篇 Aaron Bertrand 的博客文章规范答案的主要和/或序数罪。因此,它对整个社区没有任何好处,并且应该立即永久地将作者从所有 StackExchange 站点中删除,并且应该从中删除作者提供的任何内容。微软出色的文档在多大程度上可能导致任何(错误)理解,这无关紧要。

于 2013-10-11T18:09:57.847 回答
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())
于 2013-10-11T02:28:51.800 回答