Я использую Bigint для обработки функции datediff в миллисекундах. Как обрабатывать с использованием типа данных
Я использую storeprocedure

alter function [dbo].[date2timestamp]
 (@dateStr char(255))

returns bigint

as

 begin

 return convert(bigint, datediff(microsecond, '01-01-1970 00:00:00',@dateStr))

 end

Функция datediff привела к переполнению. Число частей даты, разделяющих два экземпляра даты / времени, слишком велико. Попробуйте использовать datediff с менее точной частью даты.

0
3313 aloha 16 Ноя 2022 в 17:14
Почему вы используете char(255) для своего параметра? Почему не тип данных даты и времени? Какое значение date имеет длину ровно 255 символов?
 – 
Larnu
16 Ноя 2022 в 17:20

1 ответ

Здесь есть пара вопросов. Во-первых, ваш входной параметр неверен; это должно быть значение даты и времени (я собираюсь принять datetime2(7)).

Также, если вам нужен bigint, используйте DATEDIFF_BIG, который возвращает bigint; нет смысла преобразовывать int в bigint, если int уже переполнено:

ALTER FUNCTION [dbo].[date2timestamp] (@Date datetime2(7))
RETURNS bigint
AS
BEGIN

    RETURN DATEDIFF_BIG(MICROSECOND, '19700101', @Date);

END;

Однако, если вы не используете SQL Server 2019+, я также не рекомендую использовать скалярную функцию. Переключитесь на встроенную функцию табличного значения:

DROP FUNCTION IF EXISTS [dbo].[date2timestamp]; --As you can't ALTER function from scalar to table value
GO
ALTER FUNCTION [dbo].[date2timestamp] (@Date datetime2(7))
RETURNS table
AS
    RETURN SELECT DATEDIFF_BIG(MICROSECOND, '19700101', @Date) AS date2timestamp;
0
Larnu 16 Ноя 2022 в 17:26