有没有更简单的方法将SQL Server中的日期时间设置为23:59:59
大家早上好 我正在尝试重构一个SQL存储过程。我不是SQL专家,但有些事情告诉我,一定有更好的方法来做到这一点有没有更简单的方法将SQL Server中的日期时间设置为23:59:59,sql,sql-server,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
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)
和qtrh.StatusTime您可以将日期转换为varchar,添加您的“23:59:59”,然后将其转换回datetime如何
SET @ipv_dtEndDate = CONVERT(varchar, @ipv_dtEndDate, 101) + ' 23:59:59'
如果@ipv\u dtEndDate
的唯一用法在Where子句中,则可以在@ipv\u dtEndDate不为NULL的情况下删除整个块,并将SQL查询中的条件替换为:
AND qtrh.StatusTime < DATEADD(dd,1,IsNull(@ipv_dtEndDate, qtrh.StatusTime))
和qtrh.StatusTime
(严格地说,您现在还将包括23:59:59和00:00:00之间的StatusTime值,这些值以前被排除在外。)如果您对varchar方法感到不舒服,可以执行以下操作
SET @ipv_dtEndDate = DATEADD(ss, DATEDIFF(ss, 0, '11:59:59'), @ipv_dtEndDate)
通常我使用<和第二天的日期,而不是尝试运行来将没有时间的日期(更确切地说,时间设置为“午夜的早晨”)转换为“一天的结束”,
您只需添加秒数:
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精确到[333]毫秒,因此一天的结束实际上是:
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
使用内置(和基于数学的)日期/时间函数将比转换为字符串并返回更有效。这将返回当前的最新时间:
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)))
和qtrh.status的时间是晚上9:40。晚安。如果@ipv_dtEndDate有时间,这不仅很难阅读,而且是不正确的。如果您试图将时间设置为23:59:59,则必须首先清除它。+1:端点排除逻辑比-1端点逻辑好得多。它保留了计算持续时间的能力(这应该是使用它的充分理由)。如果@ipv\u dtEndDate为Null,这会给StatusTime增加一天吗?@HCabnettek:是-这确保了如果@ipv\u dtEndDate为Null,条件始终为true,因为qtrh.StatusTime
始终为true(其中qtrh.StatusTime不为空)。
AND qtrh.StatusTime <= DATEADD(ms, -2, DATEADD(dd, 1, DATEDIFF(dd, 0, @ipv_dtEndDate)))