只有没有时间的MS SQL日期

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

感谢大家的好评.很多有用的信息.我将改变我们的功能以消除操作员左侧的功能.虽然我们的大多数日期列都不使用索引,但它可能仍然是一种更好的做法.

Jos*_*rke 81

如果您正在使用SQL Server 2008,它现在已内置,请参阅在线书籍

CAST(GETDATE() AS date)


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)


Joe*_*orn 9

其他人发布的日期函数是处理此问题的最正确方法.

然而,你提到术语"地板"很有趣,因为有一点点黑客会运行得更快:

CAST(FLOOR(CAST(@dateParam AS float)) AS DateTime)
Run Code Online (Sandbox Code Playgroud)


Aar*_*onS 7

CONVERT(date, GETDATE())并且CONVERT(time, GETDATE())在SQL Server 2008中工作.我不确定2005年.


小智 5

这个怎么样?

SELECT DATEADD(dd, DATEDIFF(dd,0,GETDATE()), 0)
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

129754 次

最近记录:

13 年,4 月 前