admin

MS SQL日期,没有时间

sql

问题

大家好,

在相当长的一段时间里,我对于使用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

解决方案

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


阅读 160

收藏
2021-05-10

共1个答案

admin

这对性能非常不利,请看一看“只有在数据库中才能通过更改几行代码来获得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)

运行此命令以查看其作用

select dateadd(dd, datediff(dd, 0, getdate())+1, 0)
select dateadd(dd, datediff(dd, 0, getdate())+0, 0)
2021-05-10