日期查询和哪个更有效之间有什么区别?

-3 index sql-server t-sql

Where tt.transactiondate >= getdate () -1

Where tt.transaciondate >= dateadd (day, -1, getdate())

Where dateadd (day, 1, tt.transactiondate) >= get date()

Where datediff (day, tt.transactiondate, getdate() <= 1
Run Code Online (Sandbox Code Playgroud)

查询之间有什么区别?哪个查询效率更高?

谢谢

sep*_*pic 6

您的查询不是“查询”,它们只是where子句。

如果您的问题是编写 where 条件的最佳方法是什么,那么答案是

Where tt.transaciondate >= dateadd (day, -1, getdate())
Run Code Online (Sandbox Code Playgroud)

这是因为如果有索引,transaciondate则仅当您的index key field( transaciondate) 不在某个函数内时才可以使用它,即在这些情况下:

Where dateadd (day, 1, tt.transactiondate) >= get date()

Where datediff (day, tt.transactiondate, getdate() <= 1
Run Code Online (Sandbox Code Playgroud)

无法使用交易日期(如果存在)上的索引。

这样写的条件

Where tt.transactiondate >= getdate () -1
Run Code Online (Sandbox Code Playgroud)

没有记录,因为您不能inegersdatetime这种方式添加/减去。

记录在案的方法是使用dateadd()函数。

更新

这个问题已经有了答案:

两个查询

select dateadd(day,-1,getdate())

select GETDATE() - 1
Run Code Online (Sandbox Code Playgroud)

返回相同的结果,这让我感到惊讶。第一个查询显然是在处理天数,显然,第二个查询中的“-1”也被解释为天数。该转换功能记录在哪里?

Erland Sommarskog在这里给出:dateadd(day,-1,getdate()) vs. getdate() - 1 我想在这里复制:

我不确定它是否被记录在案。无论如何,它肯定是完美的废话。

发生的事情是这样的:表达式“ getdate() - 1”包括两个不同的data types. SQL Server有一个 strict data-type precedence,并且 > 当两种不同的数据类型在 in 中相遇时SQL Server,lower 的类型precedence被转换为另一种类型(或者error如果没有 i 则有an mplicit conversion)。

int具有较低的precedencedatetime,所以1被转换到 1900-01-02午夜。现在你有:

SELECT getdate() - datetime(1900-01-02 00:00:00.000)
Run Code Online (Sandbox Code Playgroud)

这在逻辑上当然不是很有意义。但是由于 的底层表示datetime是十进制数“它只是有效”。

但是,如果您尝试:

SELECT sysdatetime() - 1
Run Code Online (Sandbox Code Playgroud)

你得到:

消息 206,级别 16,状态 2,第 1 行操作数类型冲突:datetime2 与 int 不兼容

对于 中添加的新date/time数据类型SQL 2008,没有从 的隐式转换int,也没有对值进行加法或减法。