

я верю, что ты можешь использовать
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t TIMESTAMP
DEFAULT CURRENT_TIMESTAMP
);
начиная с версии 3.1 (источник)
@mckoss благодаря вашему комментарию оператор create стал: ... mycolumn default (strftime ('% s', 'now'))
«... default (strftime ('% s', 'now'))» не является постоянным выражением, не будет работать со значением по умолчанию, дающим «Ошибка: значение по умолчанию для столбца [...] не является постоянным».
@mckoss - это хорошо, но SQLite игнорирует "(4)" после "INTEGER". Документация по SQLite: типы данных в SQLite версии 3 говорит, что «числовые аргументы в круглых скобках, следующие за именем типа ... игнорируются SQLite» и что количество байтов, используемых для хранения значения класса хранения «INTEGER», зависит «от величины значения». Итак, я думаю, вы правы, что SQLite будет хранить его всего с 4 байтами, но к 2038 году ему придется использовать 6 байтов - надеюсь, к тому времени компьютеры смогут кодировать - и 8 байтов к 4461642 году.
по словам доктора hipp в недавнем сообщении со списком:
CREATE TABLE whatever(
....
timestamp DATE DEFAULT (datetime('now','localtime')),
...
);
Большое спасибо! Меня не удовлетворил формат CURRENT_TIMESTAMP, поэтому я создал свою собственную функцию на C, чтобы возвращать количество микросекунд, прошедших с эпохи, и я рад, что теперь могу использовать это как DEFAULT.
Это просто синтаксическая ошибка, нужны скобки: (DATETIME('now'))
Если вы посмотрите на документация, вы заметите круглую скобку, которая добавлена вокруг опции «expr» в синтаксисе.
Это синтаксическая ошибка, потому что вы не написали скобку
если вы напишете
Select datetime('now') then it will give you utc time but if you this write it query then you must add parenthesis before this so (datetime('now')) for UTC Time. for local time same Select datetime('now','localtime') for query
(datetime ('сейчас', 'местное время'))
Может быть лучше использовать тип REAL, чтобы сэкономить место для хранения.
Цитата из раздела 1.2 Типы данных в SQLite версии 3
SQLite does not have a storage class set aside for storing dates and/or times. Instead, the built-in Date And Time Functions of SQLite are capable of storing dates and times as TEXT, REAL, or INTEGER values
CREATE TABLE test (
id INTEGER PRIMARY KEY AUTOINCREMENT,
t REAL DEFAULT (datetime('now', 'localtime'))
);
см. ограничение столбца.
И вставлять - строка без какого-либо значения.
INSERT INTO "test" DEFAULT VALUES;
Я предпочитаю integer(n), где можно выбрать подходящее значение для n.
Это полный пример, основанный на других ответах и комментариях к вопросу. В примере метка времени (столбец created_at) сохраняется как часовой пояс эпоха unix UTC и конвертируется в местный часовой пояс только при необходимости.
Использование эпохи unix экономит место для хранения - 4 байта целого числа против 24 байтовой строки при хранении в виде строки ISO8601, см. типы данных. Если 4 байта недостаточно, можно увеличить до 6 или 8 байтов.
Сохранение метки времени в часовом поясе UTC позволяет удобно отображать разумное значение для нескольких часовых поясов.
Версия SQLite - 3.8.6, которая поставляется с Ubuntu LTS 14.04.
$ sqlite3 so.db
SQLite version 3.8.6 2014-08-15 11:46:33
Enter ".help" for usage hints.
sqlite> .headers on
create table if not exists example (
id integer primary key autoincrement
,data text not null unique
,created_at integer(4) not null default (strftime('%s','now'))
);
insert into example(data) values
('foo')
,('bar')
;
select
id
,data
,created_at as epoch
,datetime(created_at, 'unixepoch') as utc
,datetime(created_at, 'unixepoch', 'localtime') as localtime
from example
order by id
;
id|data|epoch |utc |localtime
1 |foo |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02
2 |bar |1412097842|2014-09-30 17:24:02|2014-09-30 20:24:02
Местное время правильное, поскольку на момент запроса я нахожусь в UTC + 2 DST.
В этом альтернативном примере местное время сохраняется как целое число, чтобы сохранить 20 байтов. Работа выполняется в полях default, Update-trigger и View. strftime должен использовать '% s' (одинарные кавычки), потому что "% s" (двойные кавычки) вызывал у меня ошибку 'Not Constant'.
Create Table Demo (
idDemo Integer Not Null Primary Key AutoIncrement
,DemoValue Text Not Null Unique
,DatTimIns Integer(4) Not Null Default (strftime('%s', DateTime('Now', 'localtime'))) -- get Now/UTC, convert to local, convert to string/Unix Time, store as Integer(4)
,DatTimUpd Integer(4) Null
);
Create Trigger trgDemoUpd After Update On Demo Begin
Update Demo Set
DatTimUpd = strftime('%s', DateTime('Now', 'localtime')) -- same as DatTimIns
Where idDemo = new.idDemo;
End;
Create View If Not Exists vewDemo As Select -- convert Unix-Times to DateTimes so not every single query needs to do so
idDemo
,DemoValue
,DateTime(DatTimIns, 'unixepoch') As DatTimIns -- convert Integer(4) (treating it as Unix-Time)
,DateTime(DatTimUpd, 'unixepoch') As DatTimUpd -- to YYYY-MM-DD HH:MM:SS
From Demo;
Insert Into Demo (DemoValue) Values ('One'); -- activate the field Default
-- WAIT a few seconds --
Insert Into Demo (DemoValue) Values ('Two'); -- same thing but with
Insert Into Demo (DemoValue) Values ('Thr'); -- later time values
Update Demo Set DemoValue = DemoValue || ' Upd' Where idDemo = 1; -- activate the Update-trigger
Select * From Demo; -- display raw audit values
idDemo DemoValue DatTimIns DatTimUpd
------ --------- ---------- ----------
1 One Upd 1560024902 1560024944
2 Two 1560024944
3 Thr 1560024944
Select * From vewDemo; -- display automatic audit values
idDemo DemoValue DatTimIns DatTimUpd
------ --------- ------------------- -------------------
1 One Upd 2019-06-08 20:15:02 2019-06-08 20:15:44
2 Two 2019-06-08 20:15:44
3 Thr 2019-06-08 20:15:44
Если вам нужна точность до миллисекунды, попробуйте следующее:
CREATE TABLE my_table (
timestamp DATETIME DEFAULT (strftime('%Y-%m-%dT%H:%M:%fZ', 'now'))
);
Тем не менее, это сохранит временную метку в виде текста.
Если вас беспокоит размер хранилища, обратите внимание, что этот рецепт сохранит ваши временные метки в ISO-8601 (текстовый формат), занимая около 24 байтов в базе данных на дату. Вы можете сэкономить место, просто используя столбец INTEGER (4) и сохраняя время unix с помощью «INSERT INTO test (t) values (strftime ("% s ", CURRENT_TIME));