Неожиданное поведение с помощью функции T-SQL DATETIMEOFFSETFROMPARTS - PullRequest
0 голосов
/ 29 октября 2019

Функция 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.

Когда 9-й параметр DateTimeOffsetFromParts не равен 0, я получаю ошибку 289:«Не удается создать тип данных datetimeoffset, некоторые аргументы имеют недопустимые значения». Тем не менее, смещение минут от 0 до 59 должно быть допустимым, включая 30.

1 Ответ

0 голосов
/ 30 октября 2019

Как указал ZLK, входные аргументы 8 и 9 в DATETIMEOFFSETFROMPARTS должны иметь один и тот же знак: оба положительные или оба отрицательные. Поэтому правильная строка в коде:

 SET @D2 = DATETIMEOFFSETFROMPARTS(2017, 1, 1, 1, 1, 0, 0, -4, -30, 0);
...