我正在阅读一位前任撰写的剧本。
有人可以向我解释为什么这句话
--- 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 :(得分: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 Clause :所提供的信息未经Aaron Bertrand批准。此外,无论多么模糊或做作,作者未能指出在任何给定环境中它可能不适用或不太理想的所有可能方式。作者还犯了一个主要和/或有序的罪,即未明确引用至少三(3)个Aaron Bertrand的博客文章和规范答案。因此,它对整个社区没有任何好处,作者应该立即永久地从所有StackExchange站点中放逐,并且应该从中删除作者提供的任何内容。重要的不是微软的精彩文档在多大程度上可能导致任何(错误的)理解。
答案 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())