嗯,好的。我不是很精通SQL,所以我只是说说我以前读过的东西。我得自己试试看。再次感谢@Zajn:关于时间截断技术的性能比较,我已经读过这样的日期时间转换可能非常低效,但我会尝试一下。谢谢你的意见!这并不是很低效DATEADD(DAY,DATEDIFF(D

嗯,好的。我不是很精通SQL,所以我只是说说我以前读过的东西。我得自己试试看。再次感谢@Zajn:关于时间截断技术的性能比较,我已经读过这样的日期时间转换可能非常低效,但我会尝试一下。谢谢你的意见!这并不是很低效DATEADD(DAY,DATEDIFF(D,sql,sql-server,stored-procedures,dynamic-queries,Sql,Sql Server,Stored Procedures,Dynamic Queries,嗯,好的。我不是很精通SQL,所以我只是说说我以前读过的东西。我得自己试试看。再次感谢@Zajn:关于时间截断技术的性能比较,我已经读过这样的日期时间转换可能非常低效,但我会尝试一下。谢谢你的意见!这并不是很低效DATEADD(DAY,DATEDIFF(DAY,0,@date),0)速度更快,但也非常接近强制转换(@dateas date)在SQL 2008 afaik中更快。我会使用,其中v.ScheduledDate>=CAST(@d作为日期)和v.ScheduledDate




嗯,好的。我不是很精通SQL,所以我只是说说我以前读过的东西。我得自己试试看。再次感谢@Zajn:关于时间截断技术的性能比较,我已经读过这样的日期时间转换可能非常低效,但我会尝试一下。谢谢你的意见!这并不是很低效
DATEADD(DAY,DATEDIFF(DAY,0,@date),0)
速度更快,但也非常接近<代码>强制转换(@dateas date)在SQL 2008 afaik中更快。我会使用
,其中v.ScheduledDate>=CAST(@d作为日期)和v.ScheduledDate<(CAST(@d作为日期)+1)
Hmm,好的。我不是很精通SQL,所以我只是说说我以前读过的东西。我得自己试试看。再次感谢@Zajn:有关时间截断技术的良好性能比较,请参见旁注:Lookup
sp_executesql
,以便对查询进行参数化。(缓存计划、类型安全、易于调试等)感谢DEM。我一直在考虑使用它,但我只是没有时间重新编写我的查询。我还在努力让它正常工作!这是
sp_executesql
的一个好处,它让您可以使事情更整洁,不需要将日期转换为字符串(隐式或其他方式)来创建查询。它缩小了可能的错误来源的范围。哦,我没有意识到这一点。我想我会尝试使用
sp\u executesql
。如果我理解正确,那么我是否不需要将@d param声明为VARCHAR?这是创建日期时间的最佳方法:
DATEADD(day,DATEDIFF(day,0,@datetime),0)
删除侧边的时间注意:Lookup
sp_executesql
,以便您可以对查询进行参数化。(缓存计划、类型安全、易于调试等)感谢DEM。我一直在考虑使用它,但我只是没有时间重新编写我的查询。我还在努力让它正常工作!这是
sp_executesql
的一个好处,它让您可以使事情更整洁,不需要将日期转换为字符串(隐式或其他方式)来创建查询。它缩小了可能的错误来源的范围。哦,我没有意识到这一点。我想我会尝试使用
sp\u executesql
。如果我理解正确,那么我是否不需要将@d参数声明为VARCHAR?这是创建datetime的最佳方法:
DATEADD(day,DATEDIFF(day,0,@datetime),0)
要删除时间,我不确定这是否是可搜索的,因此没有充分使用索引。可以尝试并检查执行计划。@Dems:因为列(v.ScheduledDate)被包装在函数调用中,所以无论如何它都不会适当地使用索引(无论是这个答案还是原始发布的代码)。这里充分利用索引的唯一方法是重写条件以搜索一系列v.ScheduledDate值,如您的答案所示。很抱歉,如果这是你想要表达的意思,我对你的评论不太清楚。@Tao-事实上,
DATEADD(DAY,DATEDIFF(DAY,0,v.ScheduledDate),0)
是可以接受的。有些函数是,有些函数不是。@Dems:你能以某种方式确认吗?我刚刚进行了一次快速测试,它似乎反驳了你的说法(在SQL 2008 R2上进行了测试,但我在2000年和2005年的比赛中有过这样的经历):。不管怎样,你知道在哪里可以找到什么函数实际上是可搜索的吗?“我以为没有人是。”陶-是的,显然我有很多证据。证明我错了的证据。哎呀,我不确定这是否是可搜索的,因此没有充分利用索引。可以尝试并检查执行计划。@Dems:因为列(v.ScheduledDate)被包装在函数调用中,所以无论如何它都不会适当地使用索引(无论是这个答案还是原始发布的代码)。这里充分利用索引的唯一方法是重写条件以搜索一系列v.ScheduledDate值,如您的答案所示。很抱歉,如果这是你想要表达的意思,我对你的评论不太清楚。@Tao-事实上,
DATEADD(DAY,DATEDIFF(DAY,0,v.ScheduledDate),0)
是可以接受的。有些函数是,有些函数不是。@Dems:你能以某种方式确认吗?我刚刚进行了一次快速测试,它似乎反驳了你的说法(在SQL 2008 R2上进行了测试,但我在2000年和2005年的比赛中有过这样的经历):。不管怎样,你知道在哪里可以找到什么函数实际上是可搜索的吗?“我以为没有人是。”陶-是的,显然我有很多证据。证明我错了的证据。哦,这看起来很有希望。我将尝试相应地重新编写查询,并让您知道它是如何工作的。谢谢SQL Server似乎不喜欢@date=CAST(@d AS date)行。这可能是因为@d声明为VARCHAR吗?它在@d附近给了我一个“不正确的语法-期望选择或”(“”@zajn:可能,将其更改为DATETIME或DATE数据类型,然后看看您得到了什么。也可能您无法使用表达式,因此您可能需要
设置@d=CAST(@d AS DATE)
在执行
SP_EXECUTE
之前,您只需在那里执行
@date=@d,
。谢谢,这样就消除了错误。现在执行查询,但我仍然得到了比我应该得到的更多的记录。它似乎在返回Employees表中的每一条记录,然后连接两个预定日期因此,它实际上返回了正确的计划日期,但它的作用似乎是每个员工都有计划的访问,而不仅仅是两个实际的访问。您可能需要将转换与日期类型一起使用,而不是强制转换。这看起来很有希望。我将尝试相应地重新编写查询,并让您知道它是如何工作的。谢谢!SQL Server似乎不喜欢@date=CAST(@d AS date)行。这可能是因为我将@d声明为VARCHAR吗?它给了我一个“靠近@d的不正确语法-期望选择或”(“”@zajn:可能,将其更改为DATETIME或d)
DATEDIFF(day, @d, v.ScheduledDate) = 0
SET @sql = 'SELECT e.Id, e.FirstName, e.LastName, v.ScheduledDate
            FROM Employee e, Visit v
            WHERE 1=1'
-- Several IF IS NOT NULL statements here

IF @d IS NOT NULL
BEGIN
  SET @sql = @sql + ' AND DATEDIFF(day, ''' + @d + ''',' + 'v.ScheduledDate) = 0
  AND v.EmpId = e.Id '
END
EXEC (@sql)
DECLARE @dt DATETIME
SELECT @dt = GETDATE()
SELECT CAST(FLOOR(CAST(@dt AS FLOAT)) AS DATETIME)
DATEDIFF(day,SchDate,GetDate()) = 0
(AND day(@d) = day (v.ScheduledDate)) AND (month(@d) = month(v.ScheduledDate)) AND (year(@d) = year(v.ScheduledDate))
SET @sql = N'SELECT e.Id, e.FirstName, e.LastName, v.ScheduledDate
             FROM Employee e, Visit v
             WHERE v.EmpId = e.Id'

-- Several IF IS NOT NULL statements here
IF @d IS NOT NULL
  SET @sql = @sql + N' AND (v.ScheduledDate >= @date AND v.ScheduledDate < @date + 1)'

-- This stays the same, EVEN if the parameter is NULL and not used
-- This ensures execution plan re-use is available
SET @param_definition = '@date DATETIME,    -- Or whatever type v.ScheduledDate is
                         @smeg INT,
                         @head WHATEVER'

SP_EXECUTESQL
    @sql,
    @param_definition,
    @date = CAST(@d AS DATE),
    @smeg = 0,
    @head = NULL