Как преобразовать дату и время в хранилище в формате Hex в SQL?

У меня есть существующие таблицы данных, которые включают поле шестнадцатеричных данных, которое на самом деле является датой.

Из существующего кода я знаю, что данные преобразуются в значения DATETIME с помощью:

SELECT CAST(0x0000214900000000 AS DATETIME) 

Моя проблема сейчас в том, что мне нужно вручную вставлять значения в такие поля, но я не знаю, как сгенерировать шестнадцатеричное значение для данного DATETIME.

Я попытался вставить AS BINARY(8), но это не возвращает правильное значение, как указано выше.

Как выполнить это преобразование?


person Community    schedule 18.08.2015    source источник
comment
это поле метки времени?   -  person Jahirul Islam Bhuiyan    schedule 18.08.2015
comment
каково входное шестнадцатеричное значение образца и ожидаемое значение даты вывода?   -  person HaveNoDisplayName    schedule 18.08.2015
comment
Хм? Я не знаю. Это значения, которые создаются, когда я пишу таблицы данных в SQLServer. Они выглядят так, как показано выше, и мне нужны именно такие значения. - образец входного значения представляет собой обычную дату, например: 1923-05-18 00:00:00.000. вывод, как указано выше   -  person    schedule 18.08.2015
comment
Возьмите свою дату и вычтите «1900-01-01», теперь Days of the Timespan — это количество дней для преобразования в шестнадцатеричном виде, временная часть более сложная, но если она вам не нужна, просто добавьте недостающие 8 нулей.   -  person Steve    schedule 18.08.2015
comment
Здесь квази-дубликат stackoverflow.com/questions/7412944/   -  person Steve    schedule 18.08.2015


Ответы (1)


Если вы делаете это ВСЕ в SQL, вот простой пример, который существует в памяти. Вы можете запустить это как есть в SQL Management Studio, и синтаксис должен подойти для SQL Server 2008 и выше.

DECLARE 
    @Date   DateTime = getdate()
,   @Hex    varbinary(8)
;

DECLARE @Temp TABLE ( value varbinary(8) );

INSERT INTO @Temp VALUES (0x0000214900000000),(cast(@Date AS varbinary));

Select
    value
,   cast(value AS DateTime)
from @Temp

SELECT @Hex = cast(cast('2015-04-01' AS DateTime) AS varbinary)

INSERT INTO @Temp VALUES (@Hex)

Select
    value
,   cast(value AS DateTime)
from @Temp

Вы в основном «приводите» тип объекта к другому объекту. Тем не менее, для varbinary, если вы сохраняете это, вам также необходимо указать длину. Вы можете довольно легко выполнять обратное и обратное преобразование в SQL, если разрешено преобразование типов. Если вы хотите сделать это для вставки непосредственно из кода .NET, это может немного отличаться.

person djangojazz    schedule 18.08.2015
comment
Спасибо! Это было именно то, что я искал!! - person ; 18.08.2015