Сюрпризы sqlite CURRENT_TIMESTAMP
December 13th, 2008 Begemot Posted in Не wxWidgets
Думаете достаточно просто определить стобец как
created TIMESTAMP not null default CURRENT_TIMESTAMP,
и забыть про него. В смысле не задавать значения этого поля при вставке, мол sqlite сама туда добавит текущее время? Напрасно 🙂
SQLite действительно сама занесет в него текущее время при вставке строки, но это будет время в UTC, без учета вашего смещения. В таком случае читать его надо как
SELECT datetime(created, 'localtime') FROM my_table;
вместо обычного
SELECT
created FROM my_table;
Но я думаю что лучше сразу правильно писать в дб, указывая значения для этого столбца как datetime(‘now’, ‘localtime’). В коде использованием SqliteDatabaseLayer, это будет выглядеть примерно так
PreparedStatement* pStatement = db->PrepareStatement(wxT(“INSERT INTO log (created, title) VALUES (datetime(‘now’, ‘localtime’), ?);”));
Больше про функции работы с датой в sqlite.
December 14th, 2008 at 11:10 pm
Не, лучше влепливать в UTC, так ты точно будешь уверен что когда ты на своей тачке поменяешь часовой пояс, то время в базе не будет конфликтовать. А то, допустим, летишь ті в самотете из Москвы, запостил чото в базу в 9.00 утра, пересек часовой пояс, локальное время у тебя 8.05, а запостил ты данные в 9, получается что данные запостились в будущем. А так при изменении часового пояса в системе у теб ябудет нужное время всегда отображаться.
December 14th, 2008 at 11:29 pm
Идиологически оно наверное так и есть, но имхо немного натянутый пример. во-первых не частый, во-вторых у меня конфликтов времени быть не может:) так что пофигу.
И так получается мы один раз конвертим время, когда суем в бд, а если хранить в UTC придется конвертировать при каждой выборке…
December 23rd, 2008 at 5:49 pm
Николай, расскажи, пожалуйста, почему ты выбрал SqliteDatabaseLayer, а не wxSQLite3.
December 23rd, 2008 at 5:58 pm
Черт его знает… могу точно сказать что серьозных сравнений не проводил. Но кажется мне есть две причины.
Первая, я в голове держу мысль про то, что одному из моих будущих глобальных проектов возможно понадобится сетевая бд, по все видимости FireBird, то с прицелом на это SqliteDatabaseLayer подходит больше.
Вторая, мне в то время когда я думал что взять, T-Rex дал почитать свою статью “Организуем доступ к базам данных SQLite при разработке кросс-платформенных приложений на C++/wxWidgets” http://wxwidgets.info/wx_accessing_sqlite
December 23rd, 2008 at 6:34 pm
Почувствовал ли ты какие-нибудь серьезные ограничения обертки SqliteDatabaseLayer, которых бы, скорее всего, не было, если бы она была заточена только под одну конкретную RDBMS?
December 23rd, 2008 at 6:56 pm
какие серъёзные вопросы задаешь, однако:) большой проект планируется?
Нет не почувствовал, но у меня требования маленькие – не выходящие за рамки тривиальных операций… так что ничего особо заточенного мне не надо.
Да и потом там разные классы для разных движков, то есть возможно что она и не вводит серъозных ограничений ради строгой типизации интерфейса:)
December 23rd, 2008 at 7:09 pm
Да нет, я просто перестраховщик 🙂 Перед принятием решения что использовать, стараюсь взвестить все “за” и “против”.
Я планирую переписывать свой тренажер Vocabilis на wxWidgets, а у меня там исползьуется SQLite (в новой версии, которая выйдет со дня на день). Отсюда и интерес к оберткам для баз данных.
Спасибо за ссылку.
December 23rd, 2008 at 7:43 pm
о, я свой vteacher тоже планирую на вх переписать 🙂