我不知道为什么你不能使用DATEDIFF
与MILLISECONDS
在子查询中.
SELECT * FROM ( SELECT * FROM vrghmdemo.dbo.xrmQueues WHERE DATEDIFF(DAY, CreateDateTime, GETDATE()) < 2 ) sub WHERE DATEDIFF(MS, CreateDateTime, GETDATE()) < 500
这导致(德语):
Meldung 535:Die datediff-FunktionführtezueinemÜberlauf.Die Anzahl von datepart-Werten,die zwei Datums-/Uhrzeitinstanzen trennen,istzugroß.
(英文对等):
日期函数导致溢出.分隔两个日期/时间实例的日期部分数量太大.尝试使用具有不太精确的日期部分的datediff.
如果我WHERE
再次在SubSelect之外使用相同的条件,它就可以工作.
SELECT * FROM ( SELECT * FROM vrghmdemo.dbo.xrmQueues WHERE DATEDIFF(DAY, CreateDateTime, GETDATE()) < 2 ) sub WHERE DATEDIFF(DAY, CreateDateTime, GETDATE()) < 2 AND DATEDIFF(MS, CreateDateTime, GETDATE()) < 500
为什么会这样?条件已在SubSelect中使用.
而不是计算一个DATEDIFF
毫秒,而是更改目标进行比较:
select * from vrghmdemo.dbo.xrmQueues where DATEADD(millisecond, -500, GetDate()) <= CreatedDateTime
其中,也可以使用索引(CreatedDateTime
如果存在这样的索引,则允许使用索引).
出错的原因是SQL Server自由地将计算移动到最有效计算的位置.在这种情况下,它决定将外部DATEDIFF
计算评估为扫描基表,并在它考虑子查询中的谓词之前.