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