我在for(i= 0; i < question.length; i ++)/**** ; ****/ {
question[i].style.display = "block";
}
stored procedures
由于SELECT *FROM TABLE1
WHERE (CONVERT(DATE,DateTo) BETWEEN @wkstdate AND @wkenddate))
条款中Functions
的使用可能会影响我的表现,我已将其更改如下,
where
更改代码后结果相同。但我不确定两者是否会一直给出相同的结果。上述代码带来不同结果的任何情景?
(P.S:@wkstdate和@wkenddate是
SELECT *FROM TABLE1 WHERE DateTo BETWEEN @wkstdate AND @wkenddate
值&amp; DateTo是一个DATE
值)
感谢您的建议
答案 0 :(得分:2)
这不会产生相同的结果。
让我们说DateTo
,DATETIME
值,有一个时间成分:
'2015-09-21 01:00:00'
您的@wkenddate
是'2015-09-21'
。自WHERE DateTo BETWEEN @wkstdate AND @wkenddate
&gt; '2015-09-21 01:00:00'
后,@wkenddate
将无法检索上一行CREATE TABLE tbl(DateTo DATETIME)
INSERT INTO tbl
SELECT CAST('2015-09-21 00:00:00.000' AS DATETIME) UNION ALL
SELECT CAST('2015-09-21 16:10:49.047' AS DATETIME) UNION ALL
SELECT CAST('2015-09-22 16:10:49.047' AS DATETIME) UNION ALL
SELECT CAST('2015-09-20 16:10:49.047' AS DATETIME)
DECLARE @wkstdate DATE = '20150921',
@wkenddate DATE = '20150921'
SELECT *
FROM tbl
WHERE DateTo BETWEEN @wkstdate AND @wkenddate
SELECT * FROM tbl
WHERE (CONVERT(DATE,DateTo) BETWEEN @wkstdate AND @wkenddate)
DROP TABLE tbl
。
更多示例:
WHERE
现在,使用CAST
子句中的函数确实使您的查询不具有SARGable,但也有例外。其中一个是CAST
ing to DATE
。
如果您不想DATE
到BETWEEN
,另一种选择是不使用>= and <
运算符。而是使用WHERE
DateTo >= @wkstdate
AND DateTo < DATEADD(DAY, 1, @wkenddate)
:
target
答案 1 :(得分:0)
BETWEEN
运算符无法在日期数据上正确处理Times。因此,如果您有两个日期1/1/2000
和2/1/2000
,然后要求BETWEEN
处理日期时间2/1/2000 14:00
,则此日期时间不会介于它们之间。建议从日期时间中删除时间部分,使用CONVERT
函数,因为在您的示例中可能是最好的方法。还有其他方法可以剥离时间部分,但CONVERT
可能是效率最高的。 (我的例子使用dd/mm/yyyy
格式)
我注意到存储过程的效率最低的是使用SELECT * FROM
。尝试使用显式字段选择 - 如果您想要更高效的存储过程,请最小化SQL上的负载。
答案 2 :(得分:0)
是的,两者都会给出不同的结果。
让我们说wkStDate = 9/1/2015和wkEndDta = 9/30/2015
DateTo = 9/1/2015 18:00 HRS(将包括在两个案例中)
DateTo = 9/21/2105 18:00 HRS(两种情况都包括在内)
DateTo = 9/30/2105 18:00 HRS(将包含在原始查询中但是 在没有转换的第二个查询中排除
换句话说,如果没有转换函数,将从您的查询中排除日期部分与结束日期相同并且时间大于午夜的任何值,即WkEndDate + 00:00:01 To WkEndDate + 23:59:59将被排除在外。所有其他日期将显示相同的结果。
如果您的DateTo是日期时间,并且永远不会有午夜以外的时间,则两个查询都会给出相同的结果。