Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
有没有更简单的方法将SQL Server中的日期时间设置为23:59:59_Sql_Sql Server - Fatal编程技术网

有没有更简单的方法将SQL Server中的日期时间设置为23:59:59

有没有更简单的方法将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

大家早上好

我正在尝试重构一个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)

和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)))