-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)
查询之间有什么区别?哪个查询效率更高?
谢谢
您的查询不是“查询”,它们只是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)
没有记录,因为您不能inegers
以datetime
这种方式添加/减去。
记录在案的方法是使用dateadd()
函数。
更新
这个问题已经有了答案:
两个查询
Run Code Online (Sandbox Code Playgroud)select dateadd(day,-1,getdate()) select GETDATE() - 1
返回相同的结果,这让我感到惊讶。第一个查询显然是在处理天数,显然,第二个查询中的“-1”也被解释为天数。该转换功能记录在哪里?
Erland Sommarskog在这里给出:dateadd(day,-1,getdate()) vs. getdate() - 1 我想在这里复制:
我不确定它是否被记录在案。无论如何,它肯定是完美的废话。
发生的事情是这样的:表达式“
getdate() - 1
”包括两个不同的data types
.SQL Server
有一个 strictdata-type precedence
,并且 > 当两种不同的数据类型在 in 中相遇时SQL Server
,lower 的类型precedence
被转换为另一种类型(或者error
如果没有 i 则有anmplicit conversion
)。
int
具有较低的precedence
比datetime
,所以1
被转换到1900-01-02
午夜。现在你有:Run Code Online (Sandbox Code Playgroud)SELECT getdate() - datetime(1900-01-02 00:00:00.000)
这在逻辑上当然不是很有意义。但是由于 的底层表示
datetime
是十进制数“它只是有效”。但是,如果您尝试:
Run Code Online (Sandbox Code Playgroud)SELECT sysdatetime() - 1
你得到:
消息 206,级别 16,状态 2,第 1 行操作数类型冲突:datetime2 与 int 不兼容
对于 中添加的新
date
/time
数据类型SQL 2008
,没有从 的隐式转换int
,也没有对值进行加法或减法。
归档时间: |
|
查看次数: |
105 次 |
最近记录: |