SQL部分日期比较

时间:2017-06-07 08:02:42

标签: sql sql-server performance tsql datetime

比较日期/日期时间值的PARTS时哪种方法最有效?比较日期时间的示例:

where insdate =DATEADD(month, DATEDIFF(month, 0, @insdate), 0)

where year(insdate)=year(@insdate) and month(insdate)=month(@insdate)

我正在使用sql server

2 个答案:

答案 0 :(得分:0)

我不同意Damien_The_Unbeliever的断言,你应该只使用更干净的读物,因为有一个客观的原因,为什么一种方法会优于另一种方法。其中最相关的是所谓的 SARGability

本质上,这指的是SQL Server是否可以按照设计的有效方式使用您的值,例如利用索引。

两个示例中的差异非常明确here

简而言之,如果您在相等条件的两边都有函数或计算值,那么SQL Server 肯定必须检查返回的每个值,而如果您应用SARGability的原则从关闭开始,即使您没有立即看到任何重大利益,如果需要,您至少可以在以后更好地实现这些好处。

答案 1 :(得分:0)

在我看来,实现Year或YearMonth检查的最佳方法是以YYYYMMDD格式投射日期,然后使用它。

这是一个例子:

按YearMonthDay过滤

SELECT * FROM myTable 
WHERE CONVERT(VARCHAR,MyField,112) = 20170607

按年份过滤

SELECT * FROM myTable 
WHERE CONVERT(VARCHAR,MyField,112) / 100 = 201706

按年度过滤

SELECT * FROM myTable 
WHERE CONVERT(VARCHAR,MyField,112) / 10000 = 2017

可以肯定,这比使用Year(),Month(),DateAdd(),DateDiff()函数更好。