reg*_*gex 40 sql t-sql sql-server
大家好,
我在很长一段时间内遇到了一些困惑,基本上使用T-SQL来构建DateTime SQL类型.基本上,我想将DateTime值设为2008-12-1 14:30:12并将其设为2008-12-1 00:00:00.我们为报告运行的很多查询在WHERE子句中使用了一个日期值,但是我有一天的开始和结束日期值并且使用BETWEEN,或者我找到了一些其他方法.
目前我正在使用以下内容:
WHERE CAST(CONVERT(VARCHAR, [tstamp], 102) AS DATETIME) = @dateParam
然而,这看起来有点笨重.我希望会有更简单的东西
CAST([tstamp] AS DATE)
有些地方在网上推荐使用DATEPART()函数,但最后我得到了这样的结果:
WHERE DATEPART(year, [tstamp]) = DATEPART(year, @dateParam)
AND DATEPART(month, [tstamp]) = DATEPART(month, @dateParam)
AND DATEPART(day, [tstamp]) = DATEPART(day, @dateParam)
也许我过分关注小事,如果是的话请告诉我.我只是想确保我写的东西尽可能高效.我想消除任何薄弱环节.
有什么建议?
谢谢,
C
感谢大家的好评.很多有用的信息.我将改变我们的功能以消除操作员左侧的功能.虽然我们的大多数日期列都不使用索引,但它可能仍然是一种更好的做法.
SQL*_*ace 36
这对性能非常不利,看看只在数据库中你可以通过改变几行代码获得1000%+改进
操作员左侧的功能不好
这是你需要做的
declare @d datetime
select @d = '2008-12-1 14:30:12'
where tstamp >= dateadd(dd, datediff(dd, 0, @d)+0, 0)
and tstamp < dateadd(dd, datediff(dd, 0, @d)+1, 0)
Run Code Online (Sandbox Code Playgroud)
运行它以查看它的作用
select dateadd(dd, datediff(dd, 0, getdate())+1, 0)
select dateadd(dd, datediff(dd, 0, getdate())+0, 0)
Run Code Online (Sandbox Code Playgroud)
其他人发布的日期函数是处理此问题的最正确方法.
然而,你提到术语"地板"很有趣,因为有一点点黑客会运行得更快:
CAST(FLOOR(CAST(@dateParam AS float)) AS DateTime)
Run Code Online (Sandbox Code Playgroud)
小智 5
这个怎么样?
SELECT DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
129754 次 |
| 最近记录: |