我进行了以下sql查询,以获取10年服务的所有员工的列表。我想知道这是否是最好和最有效的方法。例如:如何计算12.5中服务的所有员工的列表?
DECLARE @YEAR_CURRENT VARCHAR(4)
SET @YEAR_CURRENT = Year(getdate())
SELECT
DISTINCT
fullname,
CONVERT(varchar(10),CONVERT(date,DATEADD(year,10,years_in_service)),105) as 'anniversary',
ROUND((Datediff(dd,years_in_service,isnull(@YEAR_CURRENT,getdate()))/CONVERT(FLOAT, 365)),1) AS years_in_service_today
FROM my_database
WHERE
AND ROUND((Datediff(dd,years_in_service,isnull( @YEAR_CURRENT,getdate()))/CONVERT(FLOAT, 365)),1) >= 10
AND ROUND((Datediff(dd,years_in_service,isnull( @YEAR_CURRENT,getdate()))/CONVERT(FLOAT, 365)),1) < 11
ORDER BY
fullname ASC
答案 0 :(得分:1)
这不是最有效的方式。更好的比较是:
WHERE years_in_service >= dateadd(-11, year, coalesce(@YEAR_CURRENT, getdate())) and
years_in_service < dateadd(-10, year, coalesce(@YEAR_CURRENT, getdate()))
这更有效,因为它可以在years_in_service
上使用索引。当列上有函数时,通常不能使用索引。
如果你想要12。5年,那么将逻辑改为几个月而不是几年:
WHERE years_in_service >= dateadd(-(12 * 12 + 6), month, coalesce(@YEAR_CURRENT, getdate())) and
years_in_service < dateadd(-12 * 12, month, coalesce(@YEAR_CURRENT, getdate()))