Вернуть DATEDIFF в миллисекундах на SQL Server 2008R2 - PullRequest
1 голос
/ 05 апреля 2019

У меня есть SQL-запрос, возвращающий значение для x, которое является отметкой времени, сопоставленного с объектом C # типа long:

SELECT DATEDIFF(second, { d '1970-01-01'}, dateCompleted) AS x

Вышеприведенное утверждение работает. Однако мне нужно получить метку времени, чтобы вернуть значение в миллисекундах, а не в секундах. В SQL Server 2016 я могу сделать это:

SELECT DATEDIFF_BIG(millisecond, { d '1970-01-01'}, dateCompleted) AS x

... и это прекрасно работает. Однако я застрял на SQL Server 2008 R2.

Я мог бы вернуть значения и выполнить некоторую постобработку в C #, чтобы умножить x на 1000, но мне было интересно, есть ли способ справиться с этим в самом запросе. Я пробовал простое умножение, но оно выдает Арифметическая ошибка переполнения :

SELECT DATEDIFF(second, { d '1970-01-01'}, dateCompleted) * 1000 AS x

Кто-нибудь может подсказать, как этого добиться?

Спасибо.

Ответы [ 4 ]

1 голос
/ 05 апреля 2019

DATEDIFF возвращает INT, поэтому его нельзя использовать для возврата разницы в миллисекундах, если две даты находятся на большом расстоянии (около 25 дней). Однако вы можете вычислить разницу в секундах, умножить BIGINT на 1000 и добавить миллисекунды:

SELECT DATEDIFF(SECOND, '1970-01-01', dateCompleted)
     * CAST(1000 AS BIGINT)
     + DATEPART(MILLISECOND, dateCompleted)

Предполагая, что вам нужна UNIX метка времени, вам также необходимо добавить смещение часового пояса к результату (надеюсь, вы сохранили его вместе с датой завершения).

0 голосов
/ 05 апреля 2019

Возможно переменная?

DECLARE @milli BIGINT;

SET @milli = DATEDIFF(second,{ d '1970-01-01'},dateCompleted) * 1000.0;

SELECT @milli;
0 голосов
/ 05 апреля 2019

Datediff возвращает значение int, поэтому секунда будет иметь проблему с типом данных int.

вы можете получить минуты или дни и кратно 60 для получения секунд

SELECT DATEDIFF(m,{ d '1970-01-01'},getdate()) * 1000 * 60

0 голосов
/ 05 апреля 2019

Как насчет использования cast() или convert()?

SELECT DATEDIFF(second,{ d '1970-01-01'},dateCompleted) * convert(bigint, 1000) AS x
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...