【发布时间】:2011-06-02 09:40:08
【问题描述】:
开销是不仅在 SELECT 中使用 DateAdd 函数,而且在 WHERE 中使用; 或者使用子查询,它最初返回的数据比我需要的多,但随后可以在不使用数据库的 DateAdd 函数的情况下进行过滤。
执行计划似乎暗示它们就其而言是相同的。 我想知道哪个更有效?
DECLARE @DateFrom DateTime
SET @DateFrom = '2011-05-27'
DECLARE @DateTo DateTime
SET @DateTo = '2011-06-27'
SELECT id, name,
dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset
dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM')) as itsm_requiredbyx
FROM tablename
WHERE dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset
dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM'))
BETWEEN @DateFrom AND @DateTo
ORDER BY itsm_requiredbyx desc
---------------------------------------------------------------------------------------------
SELECT *
FROM
(
select id, name,
dateAdd(hour, datediff(hour, getdate(), getutcdate()), --UTC offset
dateadd(second, itsm_requiredbyx, '1/1/1970 12:00 AM')) as itsm_requiredbyx
from tablename
) RR
WHERE itsm_requiredbyx BETWEEN @DateFrom AND @DateTo
ORDER BY itsm_requiredbyx desc
【问题讨论】:
-
我认为这不重要。但您似乎正在对字段
itsm_requiredbyx进行计算,然后检查结果是否介于两个外部值@DateFrom和@DateTo之间。如果您不对字段进行任何计算,而是对外部值进行(反向)计算,然后检查itsm_requiredbyx是否介于这两个计算值之间,则查询可以使用itsm_requiredbyx的索引。 -
有些语言环境与 UTC 的偏移量不是整数小时数。由于您似乎正在尝试编写国际代码,因此您可能需要注意这一点。
标签: sql sql-server performance tsql