两个日期之间的SQL Server DateDiff返回不准确的值
我试图通过ETL作业将字符串转换为两个日期之间的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())
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