使用介于或小于之间的速度和减少数据库压力的首选方法是什么?
SELECT LogId
FROM [Master].[dbo].log mlog
WHERE cast(LogDate as Date) BETWEEN '2019-01-01' AND '2019-12-31'
或者,这样做会更好吗?
SET @StartLogId = (SELECT TOP 1 LogID
FROM [Master].[dbo].log mlog
WHERE LogDate >= '2019-01-01T00:00:00.000')
SET @EndLogId = (SELECT TOP 1 LogID
FROM [Master].[dbo].log mlog
WHERE LogDate < '2019-12-31T00:00:00.000'
ORDER BY LogDate DESC);
SELECT LogId
FROM [Master].[dbo].log mlog
WHERE mlog.LogId >= @StartLogId
AND mlog.LogId <= @EndLogId;
```
我个人的偏好是永远不要使用
BETWEEN
,因为它不是很清楚,从代码本身,范围是否包括2019-01-01
and2019-12-31
。我意识到可以轻松查看手册以了解BETWEEN
操作方式,但在我看来,这更容易阅读,没有任何混淆的机会:但请注意,这
cast(LogDate as date)
不是执行此查询的最佳方式。更好的解决方案是:上述语句是 SARGable,也将确保您获得所需的范围。比较
<= '2019-12-31'
实际上是指在 2019 年 12 月 31 日之前,而您实际上可能是指直到 2019 年 12 月 31 日结束。查找小于第二天开始的日期可确保您获得开始之间的所有行2019 年 1 月 1 日的一天和 2019 年 12 月 31 日的一天结束。请注意,我
T
在日期和时间组件之间包含一个;这指示 SQL Server 将该值视为ISO8601 日期,这将防止在非美国英语语言安装下可能引入的错误。