DATETIMEOFFSETFROMPARTS T-SQL函数的异常行为

问题描述 投票:0回答:1

T-SQL函数DATETIMEOFFSETFROMPARTS似乎不允许偏移量部分中的非零分钟,即第9个输入参数。

我已经尝试了各种定义DateTimeOffset数据类型的组合,这些数据类型的精度非零,但无济于事。除了可能以datetimeoffset格式组装字符串外,没有其他解决方法。那可能会起作用,但是我想看看DateTimeOffsetFromParts是否有问题,还是我自己?

-- Unexpected behavior by DATETIMEOFFSETFROMPARTS function, SQL Server 2014
DECLARE @sStatus nvarchar(MAX) = 'OK'
DECLARE @sP nvarchar(MAX);
DECLARE @D1 DateTimeOffset(0) = '1901/1/1 01:01:01 -04:30';
DECLARE @D2 DateTimeOffset(0) = '1902/2/2 02:02:02 -04:30';
SET @sP = N'ProductLevel=' + 
    CONVERT(nvarchar(25),SERVERPROPERTY('PRODUCTLEVEL')) + 
    ', ProductVersion=' + 
    CONVERT(nvarchar(25),SERVERPROPERTY('PRODUCTVERSION'));
BEGIN TRY
SET @D1 = DATETIMEOFFSETFROMPARTS(2017, 1, 1, 1, 1, 0, 0, -4, 00, 0);
-- SET @D2 = DATETIMEOFFSETFROMPARTS(2017, 1, 1, 1, 1, 0, 0, -4, 30, 0);
-- When uncommenting the above line, error 289 occurs
SET @sP = @sP + N', @D1=' + CONVERT(nvarchar(30), @D1) + N', @D2=' + 
CONVERT(nvarchar(30), @D2);
END TRY
BEGIN CATCH
    SET @sStatus = N'Err Num = ' + CONVERT(nvarchar(12), ERROR_NUMBER());
    SET @sStatus = @sStatus + N', ' + N'Err Severity = ' + 
        CONVERT(nvarchar(12), ERROR_SEVERITY());
    SET @sStatus = @sStatus + N', ' + N'Err State = ' + 
        CONVERT(nvarchar(12), ERROR_STATE());
    SET @sStatus = @sStatus + N', ' + N'Line Num = ' + 
        CONVERT(nvarchar(12), ERROR_LINE());
    SET @sStatus = @sStatus + N', ' + N'Msg: ' + ERROR_MESSAGE();
    SET @sP = @sStatus;
END CATCH
SELECT @sP AS Result;

-- Result with SET @D2 = ... commented out:
-- ProductLevel=RTM, ProductVersion=12.0.2569.0, @D1=2017-01-01 01:01:00.0 -04:00, @D2=1902-02-02 02:02:02.0 -04:30

-- Result with SET @D2 = ... uncommented (remove leading '--'):
-- Err Num = 289, Err Severity = 16, Err State = 6, Line Num = 11, Msg: Cannot construct data type datetimeoffset, some of the arguments have values which are not valid.

当DateTimeOffsetFromParts的第9个参数不为0时,出现错误289:“无法构造数据类型datetimeoffset,某些参数的值无效”。但是,从0到59的偏移分钟应该是有效的输入,包括30。

sql sql-server datetimeoffset
1个回答
0
投票

正如ZLK所指出的,DATETIMEOFFSETFROMPARTS中的输入参数8和9必须具有相同的符号:均为正,或均为负。因此,代码中的正确行是:

 SET @D2 = DATETIMEOFFSETFROMPARTS(2017, 1, 1, 1, 1, 0, 0, -4, -30, 0);
© www.soinside.com 2019 - 2024. All rights reserved.