大家早上好,
我正在尝试重构SQL存储过程.我不是SQL专家,但有些东西告诉我必须有更好的方法来做到这一点.
IF @ipv_dtEndDate IS NOT NULL
BEGIN
SET @ipv_dtEndDate = DATEADD(hh,23,@ipv_dtEndDate)
SET @ipv_dtEndDate = DATEADD(mi,59,@ipv_dtEndDate)
SET @ipv_dtEndDate = DATEADD(ss,59,@ipv_dtEndDate)
END
Run Code Online (Sandbox Code Playgroud)
稍后在WHERE子句中使用此值.这些过滤器似乎很难理解.我希望能够提出更清洁的实施方案.
AND qtrh.StatusTime <= IsNull(@ipv_dtEndDate, qtrh.StatusTime)
Run Code Online (Sandbox Code Playgroud)
这个日期计算......
AND DATEDIFF(ss,qtrh.StatusTime,ISNULL(@dtNow,DATEADD(ss,-1,qtrh.StatusTime))) < DATEDIFF(ss,ISNULL(@dtDateOptionCompare,GETDATE()),GETDATE())
Run Code Online (Sandbox Code Playgroud)
......看起来很复杂,难以理解.如果有任何SQL专家对如何改进这一点有一些建议,我很乐意听到一些想法.谢谢你的时间.度过一个愉快的假期周末.
干杯,
〜在圣地亚哥
小智 5
这个怎么样?
SET @ipv_dtEndDate = CONVERT(varchar, @ipv_dtEndDate, 101) + ' 23:59:59'
Run Code Online (Sandbox Code Playgroud)
小智 5
如果在@ipv_dtEndDateWhere子句中唯一使用的是,则可以删除整个IF @ipv_dtEndDate IS NOT NULL块,并将SQL查询中的条件替换为:
AND qtrh.StatusTime < DATEADD(dd,1,IsNull(@ipv_dtEndDate, qtrh.StatusTime))
Run Code Online (Sandbox Code Playgroud)
(严格地说,您现在还将包括23:59:59和00:00:00之间的StatusTime值,这些值之前被排除在外.)