Я использую 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 с менее точной частью даты.
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;
Похожие вопросы
Новые вопросы
sql-server
Microsoft SQL Server — это система управления реляционными базами данных (RDBMS). Используйте этот тег для всех выпусков Microsoft SQL Server, включая Compact, Express, Azure, Fast-track, APS (ранее PDW) и Azure SQL DW. Не используйте этот тег для других типов СУБД (MySQL, PostgreSQL, Oracle и т. д.). Не используйте этот тег для вопросов по программному обеспечению и разработке мобильных устройств, если только он не связан напрямую с базой данных.
char(255)
для своего параметра? Почему не тип данных даты и времени? Какое значение date имеет длину ровно 255 символов?