有没有更简单的方法将SQL Server中的DateTime设置为23:59:59

Hca*_*tek 2 sql sql-server

大家早上好,

我正在尝试重构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值,这些值之前被排除在外.)