Преобразовать строку в битовую (32) альтернативу в SQL Server?

SQL Server не предлагает тип данных bit(32) (например, Postgres). Мне нужно преобразовать string в bit(32), а затем в bigint, а затем в timestamp.

Могу привести пример:

Мне нужно преобразовать эту строку x5c081ca4 в битовое (32) значение: 01011100000010000001110010100100, затем в bigint: 1544035492, а затем в метку времени: 2018-12-05 19: 44: 52 + 01

В Postgres это будут функции: TO_TIMESTAMP (timeconv :: bit (32) :: BIGINT)

Есть идеи, как я могу решить проблему?


person Matzka    schedule 31.08.2020    source источник
comment
Вы еще не описали ни одной проблемы. Преобразовать какую строку во что? Что значит such as Postgres? Имея так мало информации, единственный ответ - Yes to all   -  person Panagiotis Kanavos    schedule 31.08.2020
comment
Показ ваших предполагаемых входных и выходных данных может помочь.   -  person Jeroen Mostert    schedule 31.08.2020
comment
Кстати, зачем проходить bit(32), если настоящая цель - int? Вопрос в том, как разобрать 32-битную шестнадцатеричную строку?   -  person Panagiotis Kanavos    schedule 31.08.2020
comment
Отвечает ли это на ваш вопрос? Сервер MS SQL - преобразование строки HEX в целое число   -  person Panagiotis Kanavos    schedule 31.08.2020
comment
Нет необходимости перебирать битовую строку. SELECT DATEADD(SECOND, CONVERT(INT, CONVERT(BINARY(4), '0x5c081ca4', 1)), '19700101'). По иронии судьбы, более сложной частью этой проблемы является преобразование метки времени в местное время, если это то, что вам нужно - T-SQL теперь может переключаться между часовыми поясами, но по-прежнему не имеет простой функции для текущего имени местного часового пояса. Вы можете преобразовать результат в DATETIMEOFFSET, если вас устраивает только время UTC.   -  person Jeroen Mostert    schedule 31.08.2020
comment
Как бы выглядело это преобразование? TODATETIMEOFFSET(DATEADD(SECOND, CONVERT(INT, CONVERT(BINARY(4), '0x5c081ca4', 1)), '19700101')), CURRENT_TIMEZONE()) Но это не работает.   -  person Matzka    schedule 02.09.2020
comment
Вместо CURRENT_TIMEZONE() я также пробовал SYSDATETIMEOFFSET(), но безуспешно.   -  person Matzka    schedule 02.09.2020


Ответы (1)


SQL Server имеет a _ 1_ тип данных:

select cast(cast('abcd' as binary(4)) as int)

Длина указывается в байтах, а не в битах, но он, вероятно, делает то, что вы хотите.

Примечание: ints - это четыре байта, поэтому вам не нужен bigint.

person Gordon Linoff    schedule 31.08.2020
comment
Вместо 1544035492 это приводит к значению 2016764720. Так что нет, это не работает. - person Matzka; 31.08.2020