Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 Извлечь дату из integer  [new]
user89
Member

Откуда:
Сообщений: 2083
Всем доброго дня! При запросе к Active Directory можно получить атрибут pwdLastSet, тип bigint.
Микрософт пишет, что это количество 100 наносекундных интервалов с 1 января 1601 (UTC)

Числа могут быть такими
130165312777939352
130162072891011748

Как их преобразовать в тип datetime?
declare @t table (pwdLastSet bigint)
insert @t values(130165312777939352),(130162072891011748)
select * from @t
25 июн 13, 10:50    [14478207]     Ответить | Цитировать Сообщить модератору
 Re: Извлечь дату из integer  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
лечше всего это сделать в приложении, вносящем данные в БД
И в C++, и в C# это делается одной-двумя операциями (кажется в Delphi тоже)
25 июн 13, 10:54    [14478250]     Ответить | Цитировать Сообщить модератору
 Re: Извлечь дату из integer  [new]
user89
Member

Откуда:
Сообщений: 2083
Паганель,

в общем да. На Delphi я тоже находил, там всё просто.
Просто хочется посмотреть на TSQL. Я тут находил решение для UNIX timestamp, пытаюсь прикрутить...
25 июн 13, 11:04    [14478364]     Ответить | Цитировать Сообщить модератору
 Re: Извлечь дату из integer  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
user89
Просто хочется посмотреть на TSQL
если секундная точность устроит
разделите на 10-7, получите количество секунд от 01.01.1601
потом отнимите количество секунд, прошедшее скажем от 01.01.1601 до 01.01.1970
а потом dateadd
25 июн 13, 11:15    [14478478]     Ответить | Цитировать Сообщить модератору
 Re: Извлечь дату из integer  [new]
Паганель
Member

Откуда: Винница
Сообщений: 22552
разделитеумножьте :)
25 июн 13, 11:16    [14478485]     Ответить | Цитировать Сообщить модератору
 Re: Извлечь дату из integer  [new]
iap
Member

Откуда: Москва
Сообщений: 47000
SELECT DATEADD(MILLISECOND,ROUND(CAST(130165312777939352 AS BIGINT)%(10000000*60)/10000.,0),DATEADD(MINUTE,CAST(130165312777939352 AS BIGINT)/10000000/60,CAST('1601'AS DATETIME2(3))));
25 июн 13, 11:33    [14478637]     Ответить | Цитировать Сообщить модератору
 Re: Извлечь дату из integer  [new]
user89
Member

Откуда:
Сообщений: 2083
iap,

спасибо!
25 июн 13, 12:00    [14478912]     Ответить | Цитировать Сообщить модератору
 Re: Извлечь дату из integer  [new]
user89
Member

Откуда:
Сообщений: 2083
окончательный вариант

declare @t table (pwdLastSet bigint)
insert @t values(130165312777939352),(130162072891011748)

select pwdLastSet,
dateadd(ms,round(pwdLastSet%(10000000*60)/10000.,0),dateadd(mi,pwdLastSet/10000000/60,cast('1601' AS datetime2(3))))
from @t
25 июн 13, 12:09    [14478981]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить