Попытка преобразовать десятичное число в дату и время в SQL Server - PullRequest
0 голосов
/ 05 ноября 2018

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

За 5 ноября 2018 года конвертируется в 636769332000000000

Для 7 ноября 2018 г. конвертируется в 636771060000000000

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

1 Ответ

0 голосов
/ 05 ноября 2018

Если это тики .NET, вы можете просто извлечь дни, секунды и наносекунды, используя целочисленную арифметику, и добавить их в эпоху (0001-01-01 00:00:00.00 UTC). Это должно быть сделано шаг за шагом, потому что DATEADD может добавлять только INT значений.

DECLARE @t TABLE (ticks BIGINT);
INSERT INTO @t VALUES
(636769332000000000),
(636771060000000000),
(636771060009999999);

-- current time test, requires SQL 2016+
INSERT INTO @t VALUES
(DATEDIFF_BIG(MICROSECOND, '0001-01-01', SYSUTCDATETIME()) * 10);

SELECT *, DATEADD(NANOSECOND, u, DATEADD(SECOND, s, DATEADD(DAY, d, CAST('0001-01-01' AS DATETIME2)))) AS thatdate
FROM @t AS t
CROSS APPLY (
    SELECT
        ticks / CAST(864000000000 AS BIGINT),
        ticks % CAST(864000000000 AS BIGINT) / 10000000,
        ticks % 10000000 * 100
) AS ca(d, s, u)

Результат:

| ticks              | d      | s     | u         | thatdate                    |
|--------------------|--------|-------|-----------|-----------------------------|
| 636769332000000000 | 737001 | 46800 | 0         | 2018-11-04 13:00:00.0000000 |
| 636771060000000000 | 737003 | 46800 | 0         | 2018-11-06 13:00:00.0000000 |
| 636771060009999999 | 737003 | 46800 | 999999900 | 2018-11-06 13:00:00.9999999 |
| 636770194571454440 | 737002 | 46657 | 145444000 | 2018-11-05 12:57:37.1454440 |
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...