早安全,
我正在尝试重构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专家对如何改进这一点有一些建议,我很乐意听到一些想法。谢谢你的时间。度过一个愉快的假期周末。
干杯,
〜在圣地亚哥
答案 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)))