Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/22.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 DateDiff返回不准确的值_Sql_Sql Server_Tsql_Sql Server 2014_Rdbms - Fatal编程技术网

两个日期之间的SQL Server DateDiff返回不准确的值

两个日期之间的SQL Server DateDiff返回不准确的值,sql,sql-server,tsql,sql-server-2014,rdbms,Sql,Sql Server,Tsql,Sql Server 2014,Rdbms,我试图通过ETL作业将字符串转换为DateTimeOffset(在SQL Server中)。基本上,我的字符串看起来像'2017-10-15',我希望将其转换为DatetimeOffset(从当前数据库服务器) 我在这句话中遇到了一些奇怪的问题,因为最终输出会比预期的值下降+1/-1分钟。至少每10条记录/百万次会发生这种情况。我试图解决这个问题,我发现问题出在DATEDIFF()方法返回+/-1分钟 SELECT DATEDIFF(MI, GETDATE(), GETUTCDATE())

我试图通过ETL作业将字符串转换为
DateTimeOffset
(在SQL Server中)。基本上,我的字符串看起来像'2017-10-15',我希望将其转换为
DatetimeOffset
(从当前数据库服务器)

我在这句话中遇到了一些奇怪的问题,因为最终输出会比预期的值下降+1/-1分钟。至少每10条记录/百万次会发生这种情况。我试图解决这个问题,我发现问题出在
DATEDIFF()
方法返回+/-1分钟

SELECT DATEDIFF(MI, GETDATE(), GETUTCDATE()) 
这应该正好返回-600(因为我的数据库服务器UTC是+10)。但是,对于少数记录,它返回-599或601。我将它们作为存储过程中的单个select语句执行,并将其作为参数返回

SQL如何在同一select语句上为
GETDATE()
GETUTCDATE()
检测两个不同的日期时间值,这很奇怪

有没有办法强制SQL在那些
DATEDIFF
参数中获取完全相同的日期,或者我在这里遗漏了什么?提前谢谢

我正在使用SQL Server 2014(v12.0)

存储过程:

CREATE PROCEDURE dbo.SPConvertDateTimeOffset
    @DateInString VARCHAR(10),
    @DateTimeOffset_Value DATETIMEOFFSET OUTPUT,
    @Datediff_Value INT OUTPUT
AS 
BEGIN 
    -- This line returns +/- 1
    SELECT @Datediff_Value = DATEDIFF(MI, GETDATE(), GETUTCDATE())  

    SELECT @DateTimeOffset_Value = SWITCHOFFSET(DATEADD(mi, @Datediff_Value, CAST(@DateInString  + ' 00:00:00' AS DATETIMEOFFSET)), DATENAME(tzoffset, SYSDATETIMEOFFSET()))
END

这两个功能不是同时执行的。因此,大约十万分之一的时间(在你的测试中)在一分钟边界的两侧

如果您只需要时区,可以尝试:

选择datepart(tz,SYSDATETIMEOFFSET())


@GordonLinoff解释了为什么会发生这种情况:由于函数在稍微不同的时间执行,它们可能返回不同的时间

要解决此问题,请尝试以下方法:

DECLARE @DateTimeOffset_Value Datetimeoffset
DECLARE @Datediff_Value INT, @DateInString VARCHAR( 10 )
SET @DateInString = CONVERT( VARCHAR, GETDATE(), 112 )
SET @DateTimeOffset_Value = TODATETIMEOFFSET( @DateInString, DATENAME(tzoffset,SYSDATETIMEOFFSET()))
SET @Datediff_Value = DATEDIFF( MI, @DateInString, @DateTimeOffset_Value )
SELECT @DateInString, @DateTimeOffset_Value, @Datediff_Value
它不使用当前日期比较

注意:在日光节约更改期间,您可能会获得与预期不同的值,具体取决于代码的运行时间


查看有关如何处理DTS更改的更多解决方案。

如果多次执行此操作,则
getdate()
getutcdate()
可能会关闭几毫秒。这真的重要吗?因为,我只得到了datediff的分钟部分。即使我做了几次,理想情况下,它也应该得到相同的datetime值。但是,如果我多次这样做,您是否有任何关于它为什么以毫秒为单位存在差异的参考资料?这可能很重要,因为
datediff()
测量时间之间的边界。我仍在尝试从MSDN中查找关于为什么GetDate()和GetUTCDate在单个选择下返回不同日期时间的任何参考/链接。然而,这个答案解决了我将日期转换为日期时间偏移量的问题。谢谢。@Bharathi-我找不到任何微软的参考资料,但在处理同一个问题时存在一些问题:和
DECLARE @DateTimeOffset_Value Datetimeoffset
DECLARE @Datediff_Value INT, @DateInString VARCHAR( 10 )
SET @DateInString = CONVERT( VARCHAR, GETDATE(), 112 )
SET @DateTimeOffset_Value = TODATETIMEOFFSET( @DateInString, DATENAME(tzoffset,SYSDATETIMEOFFSET()))
SET @Datediff_Value = DATEDIFF( MI, @DateInString, @DateTimeOffset_Value )
SELECT @DateInString, @DateTimeOffset_Value, @Datediff_Value