Хранение дат в SqlLite

Вопросы программирования и использования среды Lazarus.

Модератор: Модераторы

Хранение дат в SqlLite

Сообщение artem78 » 27.01.2022 20:39:29

Как правильно хранить паскалевский тип TDateTime в БД SqlLite? У меня не выходит.

В БД для поля выбрал тип TEXT.
Код: Выделить всё
CREATE TABLE "tbl" (
   "id"   INTEGER PRIMARY KEY AUTOINCREMENT UNIQUE,
   "dt"   TEXT
)


Добавляю так:
Код: Выделить всё
  SQLQuery1.Close;
  SQLQuery1.SQL.Text:='insert into `tbl` (`dt`) values (:t)';
  SQLQuery1.ParamByName('t').AsDateTime:=now;
  SQLQuery1.ExecSQL;
  SQLTransaction1.Commit; 


Почему-то в базу вместо строкового вида, пишет число с точкой. Ладно, фиг с ним. Идём дальше - получение данных:
Код: Выделить всё
  SQLQuery1.Close;
  SQLQuery1.SQL.Text:='select * from `tbl` order by `id` desc limit 1;';
  SQLQuery1.Open;
  SQLQuery1.First;
  ShowMessage(
    '#' +
    SQLQuery1.FieldByName('id').AsString +
    ' = ' +
    DateTimeToStr(SQLQuery1.FieldByName('dt').AsDateTime)
  );   


И вот тут мы получаем ошибку:
20220127_193123.png


Что я делаю не так?
У вас нет необходимых прав для просмотра вложений в этом сообщении.
artem78
новенький
 
Сообщения: 43
Зарегистрирован: 09.08.2015 18:52:24

Re: Хранение дат в SqlLite

Сообщение Awkward » 27.01.2022 21:30:24

А зачем хранить дату в поле типа TEXT, если есть тип DATE ?
Awkward
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2017 00:06:47

Re: Хранение дат в SqlLite

Сообщение artem78 » 28.01.2022 18:49:45

Awkward писал(а):есть тип DATE ?

В SQLite его нет!
https://wiki.freepascal.org/SQLite#SQLite3_and_Dates
artem78
новенький
 
Сообщения: 43
Зарегистрирован: 09.08.2015 18:52:24

Re: Хранение дат в SqlLite

Сообщение Awkward » 28.01.2022 20:20:36

Если его нет, какой же тип я использую?
Просто попробуйте при создании таблицы использовать этот тип. Поверьте, забот будет гораздо меньше. Да, внутри будет тип вроде REAL, но даже чисто логически будет проще воспринимать.
читаю как
Date := SQLQuery.FieldByName('Date' ).AsDateTime;
пишу как
SQLQuery.Params.ParamByName('Date' ).AsDate := Date;
проблем не испытываю
Awkward
новенький
 
Сообщения: 43
Зарегистрирован: 19.01.2017 00:06:47

Re: Хранение дат в SqlLite

Сообщение iskander » 28.01.2022 20:33:36

Просто любопытно, что получится, если выполнить вот такой код
Код: Выделить всё
  SQLite3Connection1.DatabaseName := 'Mydb.db3';
  SQLite3Connection1.CreateDB;
  SQLite3Connection1.ExecuteDirect('CREATE TABLE tbl(id INTEGER PRIMARY KEY AUTOINCREMENT, dt DATETIME NOT NULL DEFAULT 0.0)');
  SQLTransaction1.Commit;
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Хранение дат в SqlLite

Сообщение WAYFARER » 28.01.2022 23:28:58

iskander писал(а):Просто любопытно, что получится, если выполнить вот такой код

В sqlite3 запрос выполнится.
Проблем с датами нет.
https://www.sqlite.org/datatype3.html
Если при создании таблицы тип объявлен как Date/datetime, то работа автоматически происходит как с датой.
Если тип поля указан иной, то нужно использовать приведение типов
https://www.sqlite.org/lang_datefunc.html

Добавлено спустя 4 минуты 37 секунд:
Первая ссылка, пункты 2.2 и 3.1.1

artem78 писал(а):В SQLite его нет!
https://wiki.freepascal.org/SQLite#SQLite3_and_Dates

Здесь всего лишь сказано, что sqlite хранит даты как string, double или integer.
Но это не мешает работать с ними точно так же как с Date/Datetime
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 517
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Хранение дат в SqlLite

Сообщение iskander » 28.01.2022 23:49:02

Вот так иногда случается получить ответ и на риторический вопрос.
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34

Re: Хранение дат в SqlLite

Сообщение WAYFARER » 28.01.2022 23:51:26

iskander писал(а):Вот так иногда случается получить ответ и на риторический вопрос.

Ответ скорее для топикстартера был)
Аватара пользователя
WAYFARER
энтузиаст
 
Сообщения: 517
Зарегистрирован: 09.10.2009 00:00:04
Откуда: г. Курган

Re: Хранение дат в SqlLite

Сообщение iskander » 29.01.2022 00:23:59

Хм, а вопрос тогда был для кого?
iskander
энтузиаст
 
Сообщения: 590
Зарегистрирован: 08.01.2012 18:43:34


Вернуться в Lazarus

Кто сейчас на конференции

Сейчас этот форум просматривают: Yandex [Bot] и гости: 30

Рейтинг@Mail.ru