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

时间:2010-09-03 16:16:45

标签: 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

稍后在WHERE子句中使用此值。这些过滤器似乎很难理解。我希望能够提出更清洁的实施方案。

AND qtrh.StatusTime <= IsNull(@ipv_dtEndDate, qtrh.StatusTime)

这个日期计算......

AND DATEDIFF(ss,qtrh.StatusTime,ISNULL(@dtNow,DATEADD(ss,-1,qtrh.StatusTime))) < DATEDIFF(ss,ISNULL(@dtDateOptionCompare,GETDATE()),GETDATE())

...似乎很复杂且难以理解。如果有任何SQL专家对如何改进这一点有一些建议,我很乐意听到一些想法。谢谢你的时间。度过一个愉快的假期周末。

干杯,
〜在圣地亚哥

7 个答案:

答案 0 :(得分:5)

这个怎么样?

SET @ipv_dtEndDate = CONVERT(varchar, @ipv_dtEndDate, 101) + ' 23:59:59'

答案 1 :(得分:5)

如果@ipv_dtEndDate的唯一用途是在Where子句中,则可以删除整个IF @ipv_dtEndDate IS NOT NULL块,并将SQL查询中的条件替换为:

AND qtrh.StatusTime < DATEADD(dd,1,IsNull(@ipv_dtEndDate, qtrh.StatusTime))

(严格来说,您现在还将包括23:59:59和00:00:00之间的StatusTime值,这些值之前被排除在外。)

答案 2 :(得分:3)

通常我使用&lt;和第二天的日期,而不是试图在午夜的最后一秒运行&lt; +。

答案 3 :(得分:2)

您可以将日期转换为varchar,添加“23:59:59”然后将其转换回日期时间

答案 4 :(得分:0)

如果您对varchar方法感到不舒服,可以执行以下操作。

SET @ipv_dtEndDate = DATEADD(ss, DATEDIFF(ss, 0, '11:59:59'), @ipv_dtEndDate)

答案 5 :(得分:0)

要将没有时间的日期(而不是将时间设置为“早上的午夜”)转换为“当天结束”, 你可以添加秒数:

DECLARE @ipv_dtEndDate datetime

SET @ipv_dtEndDate = 'Sep 3, 2010'
PRINT convert(varchar(50), @ipv_dtEndDate, 109)  --  Before

SET @ipv_dtEndDate = dateadd(ss, 1439, @ipv_dtEndDate)
PRINT convert(varchar(50), @ipv_dtEndDate, 109)  --  After

当然,SQL datetime准确到[333rd]一毫秒,所以当天结束时实际上是:

DECLARE @ipv_dtEndDate datetime

SET @ipv_dtEndDate = 'Sep 3, 2010'
PRINT convert(varchar(50), @ipv_dtEndDate, 109)  --  Before

SET @ipv_dtEndDate = dateadd(ms, 1439997, @ipv_dtEndDate)
PRINT convert(varchar(50), @ipv_dtEndDate, 109)  --  After

使用内置(和基于数学)的日期/时间函数将比转换为字符串和返回更有效。

答案 6 :(得分:0)

这将返回今天的最新时间:

SELECT DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, GETDATE())))

只需将GETDATE()替换为您希望包含的内容。所以,在你的例子中:

AND qtrh.StatusTime <= DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, @ipv_dtEndDate)))