:: Visual Foxpro, Foxpro for DOS
datetime -> binary(8) ?
lili

Сообщений: 432
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Приветствую всех!
Как преобразовать поле типа datetime в binary(8)?
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
pasha_usue

Сообщений: 3647
Откуда: Е-бург
Дата регистрации: 06.10.2006
Смотря куда. Фокс хранит datetime в 8 байтах, эксель хранит в 8 байтах, Unix-time - тоже. Delphi tDateTime - 8 байт. И все по-разному.
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Может подойдет просто число секунд от Р.Х. или от другой даты?

? DATETIME()-DTOT(DATE(2000,1,1))
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
lili

Сообщений: 432
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Надо сбросить потом поле типа datetime() в БД на СКЛ-сервере в поле binary(8).
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Тогда вот так)
x = DATETIME()-DTOT(DATE(1000,1,1)) && секунд от 1000г
? CREATEBINARY(BINTOC(x, "8RS"))
или
? 0h + BINTOC(x, "8RS")



Исправлено 1 раз(а). Последнее : of63, 29.10.20 10:14
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
lili

Сообщений: 432
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
Ух ты ))
Поле в СКЛ-базе вроде как для фиксирования времени изменения записи (зачем-то binary(8) сделали).
Пробую - последние 8 символов все время одинаковые выходят. Хотя по определению, должно работать.
Спасибо.
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
of63

Сообщений: 25161
Откуда: Н.Новгород
Дата регистрации: 13.02.2008
Непонятно, зачем именно такое поле B(8) и как его потом использовать, т.е. получить опять DATETIME...

Доб. Т.е. вот какой вопрос к ДБА:
> сбросить потом поле типа datetime() в БД на СКЛ-сервере в поле binary(8).
как потом будет использоваться это поле при SQL-обращениях к нему?

Если задача одноразовая, то можно:
- взять исходную табличку с полем DATETIME
- в MODI STRU Hex-редакторе переделать тип поля T на Q
- в этом поле теперь видим Binary-значение DATETIME

Доб2. Заранее предупреждаю, что с CTOBIN/BINTOC на 8-ми байтах у меня не получилось:
x = 1

q = 0h + BINTOC(x, "4RS")
? CTOBIN(q, "4RS") && 1 - получили исходный X

q = 0h + BINTOC(x, "8RS")
? CTOBIN(q, "8RS") && 0.000000E+0 - получили какую-то фигню

Поэтому для получения 8-ми байтового я писал самопальную прогу, типа (m.parC - исходное число):
m.v = "" && 8-байтовая C-интерпретация числа (m.parC), с BINTOC(m.parC, "8B") что-то не получилось... См. строку: ?CREATEBINARY(BINTOC(1, "8RS"))
m.z = (SIGN(m.parC)<0)
m.x = ABS(m.parC) - IIF(m.z, 1, 0)
DO WHILE m.x>0
m.i = m.x%256
m.v = m.v + CHR(IIF(!m.z, m.i, BITXOR(m.i, 0xFF)))
m.x = (m.x-m.i)/256
ENDDO
? v
Это плохой "код" - работает только на малых числах, и на отрицательных числах неверен

Доб3. ...Я бы сделал так, на функции TTOC(время, 1):
t = DATETIME()
? TTOC(t, 1) && 20201029114455 - 14 символов, а надо уложиться в 8
а) можно, конечно, интерпретировать это как целое 14-разрядное число (это будет... по 3.5 бита на цифру, 50 бит, 7 байт хватит), и положить его в поле длиной 8, но с длинным числом в фоксе неудобно работать без доп программ
б) в 14 символах-цифрах, в каждой цифре достаточно взять только последние 4 бита кода символа, и скомпоновать их парами, получится те же 7 байт, только не представляющие собой число, а просто "сжатая" доморощеным (не совсем) способом строка цифр. Для превращения этой строки в DATETIME потребуется немного символьных команд, сдвигов, и DATETIME(,,,,,,...)



Исправлено 4 раз(а). Последнее : of63, 29.10.20 11:57
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
WbrErr

Сообщений: 1960
Дата регистрации: 05.12.2006
Может, это подойдет?
www.foxite.com
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
ssa

Сообщений: 12999
Откуда: Москва
Дата регистрации: 23.03.2005
lili
Ух ты ))
Поле в СКЛ-базе вроде как для фиксирования времени изменения записи (зачем-то binary(8) сделали).
И какой сервер используется?
Цитата:
Пробую - последние 8 символов все время одинаковые выходят. Хотя по определению, должно работать.
Спасибо.
А можно не заниматься гаданиями, а точно узнать тип поля на сервере?

------------------
Лень - это неосознанная мудрость.
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
lili

Сообщений: 432
Откуда: Сыктывкар
Дата регистрации: 07.11.2005
База на СКЛ не наша, но мы должны туда сбрасывать инфу. Тип поля binary(8), мы его потом никак не используем, но заполнение его обязательно для отслеживания "хозяевами" базы изменений записей. Поэтому нам было высказано пожелание конвертить туда время записи.
В итоге я заполняю его прямо в базе через SQLEXEC: convert(binary(8),getdate())
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
PaulWist

Сообщений: 14601
Дата регистрации: 01.04.2004
Может они имели ввиду тип поля rowversion/timestamp, тогда не нужны танцы с бубном.


------------------
Есть многое на свете, друг Горацио...
Что и не снилось нашим мудрецам.
(В.Шекспир Гамлет)
Ratings: 0 negative/0 positive
Re: datetime -> binary(8) ?
lulgu
Автор

Сообщений: 1838
Дата регистрации: 30.11.2016
of63
Доб2. Заранее предупреждаю, что с CTOBIN/BINTOC на 8-ми байтах у меня не получилось:
x = 1

q = 0h + BINTOC(x, "4RS")
? CTOBIN(q, "4RS") && 1 - получили исходный X

q = 0h + BINTOC(x, "8RS")
? CTOBIN(q, "8RS") && 0.000000E+0 - получили какую-то фигню

Поэтому для получения 8-ми байтового я писал самопальную прогу, типа (m.parC - исходное число):
m.v = "" && 8-байтовая C-интерпретация числа (m.parC), с BINTOC(m.parC, "8B") что-то не получилось... См. строку: ?CREATEBINARY(BINTOC(1, "8RS"))
m.z = (SIGN(m.parC)<0)
m.x = ABS(m.parC) - IIF(m.z, 1, 0)
DO WHILE m.x>0
m.i = m.x%256
m.v = m.v + CHR(IIF(!m.z, m.i, BITXOR(m.i, 0xFF)))
m.x = (m.x-m.i)/256
ENDDO
? v
Это плохой "код" - работает только на малых числах, и на отрицательных числах неверен


И не мудрено, подобные преобразования куда более сложнее, да и с datetime проблематичны.
Ratings: 0 negative/0 positive


Извините, только зарегистрированные пользователи могут оставлять сообщения в этом форуме.

On-line: 35 anelsasha  (Гостей: 34)

© 2000-2024 Fox Club 
Яндекс.Метрика