Значение времени по умолчанию для базы данных sqlite «сейчас»

StackOverflow https://stackoverflow.com/questions/200309

  •  03-07-2019
  •  | 
  •  

Вопрос

Возможно ли в базе данных sqlite создать таблицу со столбцом метки времени, который по умолчанию имеет значение DATETIME('now') ?

Так:

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t TIMESTAMP DEFAULT DATETIME('now')
);

Это дает ошибку...Как решить?

Это было полезно?

Решение

я верю, что ты можешь использовать

CREATE TABLE test (
  id INTEGER PRIMARY KEY AUTOINCREMENT,
  t TIMESTAMP
  DEFAULT CURRENT_TIMESTAMP
);

начиная с версии 3.1 (источник)

Другие советы

по словам Др.hipp в недавнем сообщении со списком:

CREATE TABLE whatever(
     ....
     timestamp DATE DEFAULT (datetime('now','localtime')),
     ...
);

Это просто синтаксическая ошибка, нужны круглые скобки: (DATETIME('now'))

Если вы посмотрите на документация, вы заметите скобки, добавленные вокруг опции «expr» в синтаксисе.

Это полный пример, основанный на других ответах и ​​комментариях к вопросу.В примере отметка времени (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.

Возможно, лучше использовать тип REAL, чтобы сэкономить место для хранения.

Цитата из раздела 1.2 Типы данных в SQLite версии 3

SQLite не имеет класса хранения, отложенного для хранения дат и/или времени.Вместо этого встроенные функции даты и времени SQLite способны хранить даты и время в качестве текстовых, реальных или целочисленных значений

CREATE TABLE test (
    id INTEGER PRIMARY KEY AUTOINCREMENT, 
    t REAL DEFAULT (datetime('now', 'localtime'))
);

видеть ограничение столбца .

И вставлять строку без предоставления какого-либо значения.

INSERT INTO "test" DEFAULT VALUES;

Это синтаксическая ошибка, потому что вы не написали скобки.

если ты напишешь

Выберите DateTime ('now'), тогда он даст вам время UTC, но если вы это напишите его запрос, то вы должны добавить скобку до этого (DateTime ('now')) для UTC Time.Для локального времени и то же самое Select DateTime («Теперь», «Localtime») для запроса

(datetime('сейчас','местное время'))

В этом альтернативном примере местное время сохраняется как целое число, чтобы сэкономить 20 байт.Работа ведется в полях default, Update-trigger и View.strftime должен использовать «%s» (одинарные кавычки), потому что «%s» (двойные кавычки) выдал мне ошибку «Не константа».

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
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top