Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
 Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Всем привет.
Мне необходимо разобрать внутреннюю структуру типа DATE.
Иными словами я получаю результат запроса SELECT CAST(CAST(GETDATE() AS DATE) AS VARBINARY(MAX))

В документации написано что хранится дата в трёх байтах. Так оно и есть. Только вот как из этих трёх байт получить дату я что-то найти не могу. Может кто сталкивался?
1 июл 12, 16:14    [12800623]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Сделать cast( as date), видимо.

Для чего такие извращения понадобились?
1 июл 12, 16:23    [12800634]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Мне надо на Сишарпе, я же написал.

Сделать CAST, ну юморист :))
1 июл 12, 16:25    [12800640]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Аа, или не написал, а только подумал. Надо байты разобрать в клиентском коде. Каст сделать невозможно.
1 июл 12, 16:27    [12800642]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Небольшое исследование показывает, что date хранится как три байта, которые показывают, сколько дней прошло с даты 0001-01-01, только байты перевернуты

--0001-01-01 through 9999-12-31

declare
    @zero   date = '00010101'
    , @now  date = getdate()
    
select
    [Ноль] = @zero
    , [Сейчас] = @now
    , [Разница в днях] = datediff(dd, @zero, @now)
    , [Разница в днях в бинарном виде] = cast ( datediff(dd, @zero, @now) as binary(3))
    , [Сейчас в бинаорном виде] = cast ( @now as binary(3) )


Как это в в шарпе превращать в дату - вопрос точно не в этот форум.

З.Ы. Только отстрелите вы себе такими костылями ногу, и не раз.
1 июл 12, 16:39    [12800656]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Вот это ценная информация, спасибо, проверю завтра. В сишарпе разобрать не проблема. По результатам отпишусь.
1 июл 12, 16:46    [12800664]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
Gold
Вот это ценная информация, спасибо, проверю завтра. В сишарпе разобрать не проблема. По результатам отпишусь.

А на фига то в с# это разбирать?
1 июл 12, 17:05    [12800693]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Ken@t, блин, ну как нафига? Дату получить? Какой мне толк от трёх байт????
2 июл 12, 11:21    [12802735]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
step_ks
Member

Откуда:
Сообщений: 936
а нормальным типом, а не varbinary, получать с сервера не судьба?
2 июл 12, 11:28    [12802769]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Нормальным способом в этом случае не возможно. Вернее может и возможно, но я не знаю как, поскольку данные выгребает EntityFramework. Там можно вроде запросы корректировать в маппинге руками, но как-то я не горю желанием с этим связываться.
2 июл 12, 11:43    [12802870]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
step_ks
Member

Откуда:
Сообщений: 936
вот ведь до чего дошел прогресс
2 июл 12, 12:09    [12803037]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Докладываю. Действительно, как написал Сергей Александрович, формат даты представляет из себя количество дней, прошедших с 0001-01-01, записанных в виде массива слева направо от младших байтов к старшим, т.е. младший байт - это нулевой элемент массива и т.д.

Код для получения даты примерно такой:

byte[] internalMsSqlDateBytes = <данные закодированной даты>;

byte[] totalDaysBytes = new byte[4];

totalDaysBytes[0] = internalMsSqlDateBytes[0];
totalDaysBytes[1] = internalMsSqlDateBytes[1];
totalDaysBytes[2] = internalMsSqlDateBytes[2];
totalDaysBytes[3] = 0;

int totalDays = BitConverter.ToInt32(totalDaysBytes, 0);

return new DateTime(1, 1, 1).AddDays(totalDays);
2 июл 12, 12:20    [12803143]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Ken@t
Member

Откуда: 大地
Сообщений: 3265
+

Gold
Докладываю. Действительно, как написал Сергей Александрович, формат даты представляет из себя количество дней, прошедших с 0001-01-01, записанных в виде массива слева направо от младших байтов к старшим, т.е. младший байт - это нулевой элемент массива и т.д.

Код для получения даты примерно такой:

byte[] internalMsSqlDateBytes = <данные закодированной даты>;

byte[] totalDaysBytes = new byte[4];

totalDaysBytes[0] = internalMsSqlDateBytes[0];
totalDaysBytes[1] = internalMsSqlDateBytes[1];
totalDaysBytes[2] = internalMsSqlDateBytes[2];
totalDaysBytes[3] = 0;

int totalDays = BitConverter.ToInt32(totalDaysBytes, 0);

return new DateTime(1, 1, 1).AddDays(totalDays);


Лучше бы изучили EF , чем хернёй страдать.
2 июл 12, 12:27    [12803175]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Уважаемый Ken@t, а вы на думали о том, что на вопрос что лучше изучать и что херня, а что нет, это моё личное дело и мне виднее, а уж никак не вам.
2 июл 12, 12:30    [12803184]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Gold
Уважаемый Ken@t, а вы на думали о том, что на вопрос что лучше изучать и что херня, а что нет, это моё личное дело и мне виднее, а уж никак не вам.
Мы просто заботимся о тех людях, которые будут поддерживать ваше чудо после вас. Возможно мы даже отговрим вас от этой, мягко говоря, неудачной реализации, и спасем вам немного нервов и времени, когда Microsoft в одном из сервиспаков вдруг случайно решит поменять внутренний формат типа date.

А в остальном вы совершенно правы: если хотите шишки набивать на своем собственном лбу, набивайте. Имеете полное право.
2 июл 12, 12:35    [12803216]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Если майкрософт решит поменять внутренний формат даты, то поломаются все старые программы. Вы ж прекрасно понимаете что этого не произойдёт.

Моя реализация вполне удачная. Она удовлетворяет и меня и клиента. Тем и же самыми преобразованиями занимаются все библиотеки доступа к данным. С таким же успехом можно разговаривать о том, что не удачное решение писать программы под виндоус, поскольку в один прекрасный момент майкрософт выпустит новую ОС и программы перестанут работать.
2 июл 12, 12:45    [12803303]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Gold
Если майкрософт решит поменять внутренний формат даты, то поломаются все старые программы.

Те, которые используют явные типы данных, не поломаются.
2 июл 12, 12:47    [12803313]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Пдщкн, как не поломаются? А что, по вашему, приходит в датаридер например ADO.NET провайдеру? Другие какие-то байты?? Те же самые три байта приходят. Просто провайдер за нас сам их разбирает и даёт нам готовую дату.
2 июл 12, 12:55    [12803378]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Gold
Пдщкн, как не поломаются? А что, по вашему, приходит в датаридер например ADO.NET провайдеру? Другие какие-то байты?? Те же самые три байта приходят. Просто провайдер за нас сам их разбирает и даёт нам готовую дату.
Вот именно, провайдер разбирает. И если поменяется внутренний формат, то провайдер тоже обновят, чтобы он умел это разбирать. А кто обновит ваш код - неясно.
2 июл 12, 12:56    [12803392]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Gold
Пдщкн, как не поломаются? А что, по вашему, приходит в датаридер например ADO.NET провайдеру? Другие какие-то байты?? Те же самые три байта приходят. Просто провайдер за нас сам их разбирает и даёт нам готовую дату.

Провайдер - это не моя программа.
Провайдера я обновлю и моя программа продолжит работать.
2 июл 12, 12:58    [12803407]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
А кто провайдер обновит? Вот вы пишите что провайдер обновят. Ну допустим где-то обновят. А у меня в метро без интернета сидит женщина преклонных лет, которая уже который год боится компьютера. Кто её что обновит? Ну давайте не будем сочинять. Мы все можем с большей пользой провести время, чем обсуждать то, чего на практике не может быть.
2 июл 12, 13:18    [12803564]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Программист-Любитель
Member

Откуда:
Сообщений: 16839
Получать штатное значение штатного типа данных каким-то трюком с байтами. Зачем ???
2 июл 12, 13:20    [12803579]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Гавриленко Сергей Алексеевич
Member

Откуда:
Сообщений: 37254
Gold
А кто провайдер обновит? Вот вы пишите что провайдер обновят. Ну допустим где-то обновят. А у меня в метро без интернета сидит женщина преклонных лет, которая уже который год боится компьютера. Кто её что обновит? Ну давайте не будем сочинять. Мы все можем с большей пользой провести время, чем обсуждать то, чего на практике не может быть.
Обновит любой человек, который в состоянии нажать кнопку автоматического обновления Windows. А ваш код без вас или человека, вас замещающего, не обновит никто.
2 июл 12, 13:20    [12803582]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Glory
Member

Откуда:
Сообщений: 104751
Gold
А у меня в метро без интернета сидит женщина преклонных лет, которая уже который год боится компьютера. Кто её что обновит? Ну давайте не будем сочинять. Мы все можем с большей пользой провести время, чем обсуждать то, чего на практике не может быть.

Сочиняете вы. Прям по Мояковскому почти "Будь я даже негром преклонных годов"
Нормальный код использует типы данных, а не ковыряет бинарный поток.

А женщине без интернета не нужно обновлять провайдера, если она сервер не обновила.
2 июл 12, 13:23    [12803609]     Ответить | Цитировать Сообщить модератору
 Re: Внутренняя структура типа DATE  [new]
Gold
Member

Откуда: Харьков
Сообщений: 2947
Моя программа точно так же обновляется через интернет, которого у многих нет.
Не, ну вы понимаете что между сервиспаками не меняются форматы хранения данных?

У меня данные псевдозашифрованны от всемирного заговора. Мне сказали вот те денег, сделай так, чтобы на компьютере, на котором установлена программа, всё работало, а если стырить базу, то чтобы нельзя было личные данные клиентов посмотреть.

Я репу почесал, сказал что вообще такое сделать нельзя, но можно сделать вид что всё супермегазашифровано.

Ну я взял написал функции, которые шифруют и расшифровывают по ключу, загнал необходимые данные в блобы, зашифровал и все дела. Ключ привязан к WindowsDigitalProductId. Так что у меня нету дат, нету строк, есть только зашифрованные массивы байт.

Чтобы всё это расшифровать надо нанять программиста, который дизассемблирует код моих функций и стырит алгоритм шифрования. Но поскольку зашифрованная информация стоит в разы меньше работы программиста, то все решили что данный способ шифрования достаточен. Вот и всё.
2 июл 12, 13:31    [12803698]     Ответить | Цитировать Сообщить модератору
Топик располагается на нескольких страницах: [1] 2   вперед  Ctrl      все
Все форумы / Microsoft SQL Server Ответить