Преобразование Sql Server DateTime в миллисекунды С 1970 года

Я хочу преобразовать datetime sql server в миллисекунды. Я попытался преобразовать его с функцией latiff, как показано ниже:

select cast(Datediff(ms, '1970-01-01',GETUTCDATE()) AS bigint) 

Но это дает мне эту ошибку:

Msg 535, уровень 16, состояние 0, строка 2 Датированная функция привела к переполнению. Количество дат, разделяющих два экземпляра даты / времени, слишком велико. Попробуйте использовать датифф с менее точной датой.

Я не хочу делать это так:

 select cast(Datediff(minute, '1970-01-01',GETUTCDATE()) AS bigint)*60*1000 

Потому что это не даст мне точных результатов. Может кто-нибудь, пожалуйста, помогите мне в этом?

Вы уверены, что вам это нужно до миллисекунд (тысячные доли секунды)?

Имейте в виду, что 1 день = 86 400 000 мс (да, 86,4 миллиона)

1 год = около 31,6 миллиарда миллисекунд.

1970 год был (на сегодняшний день) 44 года назад, так что это примерно 1,4 триллиона миллисекунд назад.

Конечно, bigint может справиться с этим, к сожалению, вы также попали в лимит DATEDIFF , вот цитата из документации:

Если возвращаемое значение вне диапазона для int (-2,147,483,648 до +2,147,483,647), возвращается ошибка. Для миллисекунды максимальная разница между startdate и enddate составляет 24 дня, 20 часов, 31 минуту и ​​23,647 секунды. Во-вторых, максимальная разница составляет 68 лет.

Таким образом, вы можете быстро получить разницу в секундах (пока вы не заходите слишком далеко в будущее), и вы можете посчитать миллисекунды с начала сегодняшнего дня, например:

 SELECT CAST(DATEDIFF(second, '1970-01-01', CAST(GetUtcDate() AS date)) AS bigint) AS [SecondsToStartOfDay], DATEDIFF(ms, CAST(GetUtcDate() AS date), GetUtcDate()) AS [MillisecondsSinceStartOfDay], (CAST(DATEDIFF(second, '1970-01-01', CAST(GetUtcDate() AS date)) AS bigint)*1000) + DATEDIFF(ms, CAST(GetUtcDate() AS date), GetUtcDate()) AS [Milliseconds] 

Первые два столбца предназначены только для показа шагов.

Вот функция Microsoft SQL, которая возвращает время UTC в миллисекундах (миллисекунды с 1970 года), его результат равен Java.currentTimeMillis()

 CREATE FUNCTION dbo.currentTimeMilliseconds() RETURNS BIGINT WITH EXECUTE AS CALLER AS BEGIN DECLARE @t datetime = CONVERT (datetime, GETUTCDATE()); DECLARE @days BIGINT = Datediff(day, '1970-01-01',@t); DECLARE @t_hours BIGINT = DATEPART(HOUR, @t); DECLARE @t_minuts BIGINT = DATEPART(MINUTE, @t); DECLARE @t_seconds BIGINT = DATEPART(SECOND, @t); DECLARE @t_miliseconds BIGINT = DATEPART(MILLISECOND, @t); RETURN @days * 1000 * 60 * 60 * 24 + @t_hours * 60 *60 *1000 + @t_minuts * 60 * 1000 + @t_seconds * 1000 + @t_miliseconds; END GO 

Для людей, которые все еще ищут это, вы можете использовать функцию DATEDIFF_BIG. Это поддерживается в SQL 2016+, Azure

https://docs.microsoft.com/en-us/sql/t-sql/functions/datediff-big-transact-sql

Давайте будем гением компьютера.