sql - 如何使此语句更快 : "paramDate Between startDate and NULL"?

标签 sql sql-server t-sql between

当 endDate 为 null 时,此查询需要很长时间(我认为它是关于 case 语句,在 case 语句之前它很快)

SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END) 

当 endDate 为空时,我应该使用什么来加快速度?

最佳答案

这是没有 CONVERT 或 CASE 的查询:

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,getdate())

为了确保 Sql Server 不会对每一行计算 getdate(),您可以缓存它,尽管我很确定 Sql Server 默认情况下足够智能:

declare @now datetime
set @now = getdate()

SELECT * 
FROM HastaKurumlari
WHERE '21-05-2009' between startDate and IsNull(endDate,@now)

发布查询计划可以帮助解释查询速度慢的原因:

SET SHOWPLAN_TEXT ON
go
SELECT * 
FROM HastaKurumlari
WHERE CONVERT(SMALLDATETIME,'21-05-2009',103) 
BETWEEN startDate 
    AND (CASE WHEN endDate IS NULL THEN GETDATE() ELSE endDate END)

关于sql - 如何使此语句更快 : "paramDate Between startDate and NULL"?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/847750/

相关文章:

c# - 无法在对象中插入重复的键 - 如何在 Entity Framework Core 中创建复合键

c# - 如何防止超出范围的日期时间值错误?

sql - java.sql.SQLException : Procedure or function . ..需要参数...,但未提供

SQL 查询获取该月中每一天的计数

SQL Server -XML 节点不返回多条记录

sql - 多维数据集维度处理的参照完整性错误

sql - 如何从SQL中的某个表中获取按字段的平均差异排序的列

sql-server - 如果相同的 id 重复,则限制行数

MySQL SELECT FROM 3 表与 where

sql - 按日期之间的周数