Преобразование метки времени AD с помощью T-SQL - PullRequest
0 голосов
/ 06 ноября 2019

Как преобразовать время Windows NT из запроса SQL в читаемый формат? Я выполняю извлечение учетных записей пользователей из AD и хочу конвертировать или CAST метку времени Windows AD в лучший читаемый формат. Проблема в том, что у меня возникают проблемы с преобразованием при извлечении.

Запрос:

SELECT
  CASE
    WHEN CHARINDEX('@', userPrincipalName) > 7
      THEN SUBSTRING(userPrincipalName, 1, (CHARINDEX('@', userPrincipalName)) - 1)
    ELSE ''
  END AS edipi
 ,UPPER(samaccountname) AS samaccountname
 ,givenName AS firstName
 ,sn AS lastName
 ,initials
 ,UPPER(mail) AS email
 ,userAccountControl
 ,telephoneNumber
 ,title
 ,accountExpires
FROM
  OPENQUERY
    (ADSI
     ,'select 
          givenName, 
          samaccountName, 
          userPrincipalName, 
          sn, 
          initials, 
          mail, 
          userAccountControl, 
          telephoneNumber, 
          title, 
          accountExpires
        from ''LDAP PATH''
        where objectcategory=''person'' and objectclass = ''user'' and name=''*'' '
    );

Мой запрос возвращает поле accountExpires во времени Windows NT, но я хочу, чтобы оно было чем-товот так:

2020-02-09 15: 23: 36.367

вместо этого:

132257354163700000

Я пришел к простому решениюделать конвертацию один за другим, но я хочу, чтобы он выполнял CAST по требованию вместо того, чтобы делать это для каждого пользователя

DECLARE @accountExpired BIGINT
SET @accountExpired = 132257354163700000; --This is a random time pulled from a user from the above select statement.

SELECT CAST((@accountExpired / 864000000000.0 - 109207) AS DATETIME);

1 Ответ

0 голосов
/ 06 ноября 2019

Когда SQL Server выполняет неявное преобразование из nvarchar в numeric (или что-нибудь в numeric, фактически), он устанавливает точность и масштаб по умолчанию numeric(18,0). Этого достаточно для примера данных в вашем вопросе, но сообщение об ошибке указывает, что где-то в вашем наборе данных есть значение, которое превышает емкость типа данных по умолчанию.

Чтобы преодолеть это, попробуйте явное приведениена большую емкость numeric. Может быть:

SELECT
  ...
 ,CAST((CAST(accountExpires AS numeric(28,0)) / 864000000000.0 - 109207) AS DATETIME)
 ...

Возможно, будет достаточно numeric(19,0), но если вы наберете больше 19, вы также можете перейти к 28, поскольку 20-28 имеют одинаковый размер хранилища.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...