Sql 在结果之间比较日期会降低性能
我正在查询的Sql 在结果之间比较日期会降低性能,sql,sql-server,sql-server-2008,msbi,Sql,Sql Server,Sql Server 2008,Msbi,我正在查询的where子句中使用下一个条件: CONVERT(INT, CONVERT(VARCHAR(10), DA.ACCESS_DATE, 112)) > = CONVERT(INT, CONVERT(VARCHAR(10), CCM.START_DATE, 112)) AND CONVERT(INT, CONVERT(VARCHAR(10), DA.ACCESS_DATE, 112)) < ISNULL(convert(int, con
where
子句中使用下一个条件:
CONVERT(INT, CONVERT(VARCHAR(10), DA.ACCESS_DATE, 112))
> = CONVERT(INT, CONVERT(VARCHAR(10), CCM.START_DATE, 112))
AND
CONVERT(INT, CONVERT(VARCHAR(10), DA.ACCESS_DATE, 112))
< ISNULL(convert(int, convert(varchar(10), CCM.[END_DATE], 112)), 20161001)
CONVERT(INT,CONVERT(VARCHAR(10),DA.ACCESS\u DATE,112))
>=转换(INT,CONVERT(VARCHAR(10),CCM.START_DATE,112))
及
转换(INT,CONVERT(VARCHAR(10),DA.ACCESS_DATE,112))
使用上述条件运行查询时,返回输出需要花费大量时间
有什么办法能更快地得到结果吗?对不起?为什么要将日期转换为其他类型进行比较?如果日期没有时间组件,则可以执行以下操作:
DA.ACCESS_DATE >= CCM.START_DATE AND
DA.ACCESS_DATE < COALESCE(CCM.[END_DATE], '20161001')
DA.ACCESS\u DATE>=CCM.START\u日期和
DA.ACCESS\u日期<合并(CCM.[结束日期],'20161001')
如果日期确实包含时间组件,并且您希望忽略它们,那么您应该转换为date
,但仅删除时间组件
我应该指出,这可能不会提高性能。如果合适的话,这个版本有机会利用可用的索引。使用索引将加快查询速度。对不起?为什么要将日期转换为其他类型进行比较?如果日期没有时间组件,则可以执行以下操作:
DA.ACCESS_DATE >= CCM.START_DATE AND
DA.ACCESS_DATE < COALESCE(CCM.[END_DATE], '20161001')
DA.ACCESS\u DATE>=CCM.START\u日期和
DA.ACCESS\u日期<合并(CCM.[结束日期],'20161001')
如果日期确实包含时间组件,并且您希望忽略它们,那么您应该转换为date
,但仅删除时间组件
我应该指出,这可能不会提高性能。如果合适的话,这个版本有机会利用可用的索引。使用索引将加快查询速度。是否需要转换值?是否需要转换值?是否可能重复DA.ACCESS\u日期的类型为Datetime和START\u DATE,END\u DATE是否需要在两个表上都包含索引,如果是,那么哪个索引是聚集的还是非聚集的?@AnkurJain。如果您有关于索引的问题,您应该问另一个问题并包括查询(或其简化版本)。但是,对于这个查询,您应该尝试在
da(access\u date)
和ccm(start\u date,end\u date)
上建立索引。da.access\u date的类型是Datetime,start\u date和end\u date是date。我需要在这两个表上都包含索引吗?如果需要,那么是聚集索引还是非聚集索引?@AnkurJain。如果您有关于索引的问题,您应该问另一个问题并包括查询(或其简化版本)。但是,对于这个查询,您应该在da(访问日期)
和ccm(开始日期、结束日期)
上尝试索引。