【问题标题】:How to create a datetime column with default value in sqlite3?如何在 sqlite3 中创建具有默认值的日期时间列?
【发布时间】:2019-03-25 08:42:43
【问题描述】:

有没有办法在 sqlite3 中创建一个具有默认为“现在”的日期时间列的表?

以下语句返回语法错误:

create table tbl1(id int primary key, dt datetime default datetime('now'));

更新:这是Sky Sanders提供的正确ddl:

create table tbl1(id int primary key, dt datetime default current_timestamp);

【问题讨论】:

  • @NobodyMan - 也许你可以更新你的问题,并包括适用于其他人轻松找到的 ddl。
  • @Sky - 我不反对,但这不会让你的回答变得多余吗?另外,如果我进行编辑,我应该替换不正确的 sn-p 还是简单地将正确答案附加到问题中?我有点不懂礼仪:-)
  • 当您通过最终对您有用的示例添加问题的更新时,它并没有真正减少答案。很多答案都是有用的建议,就像我的 ddl 片段和背景一样,它可以帮助您修复 ddl。通过添加正确的语句来确认解决方案是一种增值。在任何情况下都不要更改原始代码,这样有同样问题的人会找到这个解决方案。无论如何,这是一个有争议的问题,我编辑了我的答案以展示你的 ddl 的工作版本。欢呼

标签: sqlite


【解决方案1】:

试试这个:

create table tbl1(id int primary key, dt datetime default current_timestamp);

背景:

DEFAULT 约束指定一个 执行操作时使用的默认值 插入。该值可能是 NULL,一个 字符串常量、数字或 常量表达式包含在 括号。默认值可能 也是特别的人之一 大小写无关的关键字 CURRENT_TIME、CURRENT_DATE 或 CURRENT_TIMESTAMP。如果值为 NULL,一个字符串常量或数字,它 每当插入到列中 不包含的 INSERT 语句 为该列指定一个值是 执行。如果值为 CURRENT_TIME、CURRENT_DATE 或 CURRENT_TIMESTAMP,然后是当前 将 UTC 日期和/或时间插入 列。对于 CURRENT_TIME, 格式为 HH:MM:SS。对于 CURRENT_DATE, YYYY-MM-DD。格式为 CURRENT_TIMESTAMP 是“YYYY-MM-DD HH:MM:SS"。

来自http://www.sqlite.org/lang_createtable.html

【讨论】:

  • 请注意,current_timestamp 精确到秒,如果您想要毫秒,请使用 default (STRFTIME('%Y-%m-%d %H:%M:%f', 'NOW'))
【解决方案2】:
... default (datetime(current_timestamp))

default 后面的表达式必须放在括号中。如果您想使用 SQLite date and time functions or modifiers 执行日期算术,此表单很有用。

【讨论】:

  • Doug,仅当涉及表达式时才需要括号。 'current_xxxx' 是关键字并充当文字值。 sqlite.org/syntaxdiagrams.html#column-constraint
  • 天空,是的,这不是我说的吗?我的观点是,如果您想要的不仅仅是关键字提供的内容,您可以使用表达式,但表达式必须在括号中;原始问题中的 create 语句缺少括号。
  • 没有理由写 datetime(current_timestamp)。只需使用 current_timestamp。
  • 啊,也许我应该用一个更复杂的例子,比如 default (datetime('now','start of day'))
  • 如果您想要当地时间,DEFAULT (datetime('now','localtime')) 很有用。
【解决方案3】:

CURRENT_TIMESTAMP 是文字值,就像 'mystring'

列约束:

文字值:

【讨论】:

  • 是的,OP 使用的datetime('now')expr,所以它需要括号。
【解决方案4】:

您可以使用以下查询来使用表中的当前日期值

create table tablename (date_field_name Created_on default CURRENT_DATE);

【讨论】:

  • 离题,原始问题是关于日期时间字段,而不是日期字段。
猜你喜欢
  • 2016-08-02
  • 1970-01-01
  • 1970-01-01
  • 2017-01-01
  • 2018-03-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-03
相关资源
最近更新 更多