大家好,
在相当长的一段时间里,我对于使用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
WHERE CAST(CONVERT(VARCHAR, [tstamp], 102) AS DATETIME) = @dateParam
但是,这似乎有些笨拙。我希望会有更简单的东西 CAST([tstamp] AS DATE)
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
感谢大家的宝贵意见。很多有用的信息。我将改变我们的功能,以消除操作员左侧的功能。尽管我们的大多数日期列都不使用索引,但它可能仍然是一种更好的做法。
这对性能非常不利,请看一看“只有在数据库中才能通过更改几行代码来获得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)