У меня есть таблица с именем Basic, start_time - это одно поле с типом: VARCHAR (5), в котором на самом деле хранятся 5-байтовые данные времени: байты 0 и 1 отображаются в год, месяц и день, а байты 2 - 4 отображаются до часа, мин и секунды. Таким образом, возможно, все байты 2, 3, 4 равны 0. И я хочу сделать следующий запрос:
Basic.find (:all , :conditions => "start_time > ? AND end_time < ?" , start_time , end_time)
Вот вопросы:
Предположим, что в формате VARCHAR (5) время начала [214, 222,0, 0, 0] (24 июня 2009 г.) и время окончания [214, 223, 0, 0, 0] ( 25 июня 2009 г.).
Поскольку activerecord отображает VARCHAR (5) в String, в приведенном выше запросе start_time и end_time также должны быть String. Как правильно преобразовать указанное выше время формата VARCHAR (5) в строку?
Я сделал это таким образом, но не смог получить правильный результат:
tmp = [214, 222,0 ,0 ,0].map {|t| t.to_s(16)} ; start_time = tmp.to_s
И я использовал адаптер sqlite3 для активной записи.
Спасибо за вашу помощь.
Я нашел, где проблема: «\ 000» не может содержаться в start_time при выполнении следующего запроса:
Basic.find (:all , :conditions => "start_time > ? AND end_time < ?" , start_time , end_time)
Итак, мне нужно сделать два шага:
[214, 222,0, 0, 0] -> [214,222]
[214,222] -> "\ 326 \ 336"
1-й шаг можно выполнить с помощью:
a = [214,222,0,0,0]
while a.last ==0 do a.pop end
2-й шаг можно выполнить с помощью:
a = [214,222]
a.pack("c" * a.size)
Однако я все еще не могу выполнить запрос при start_time = [214, 222,0, 23, 0], потому что соответствующая строка содержит «\ 000» в середине. к счастью, это не будет большой проблемой в нашем приложении, так как мы никогда не запрашиваем на уровне часов, это означает, что последние два числа всегда будут равны 0.