如何处理SQLite中的日期类型?



我创建了一个表,其中有日期类型的"出生日期"列。问题是我可以插入任何东西并且成功完成。我希望该字段限制插入字符串等机会,而不是相关内容。 插入 错误的结果

我已经搜索了解决方案,但我只能找到用于获取不同格式的当前时间的代码。我也不明白修饰符是如何工作的(https://www.sqlite.org/lang_datefunc.html)。

除了rowid列或rowid列的别名之外,任何类型的值都可以存储在一种类型的列中。即列的类型不限制/约束可以存储的数据。

  • p.s. 没有 DATE 类型,而是由于 SQLite 的灵活性,DATE 实际上具有 NUMERIC 的类型(类型亲和力)(这并不重要)。您可能会发现SQLite版本3中的数据类型很有趣,或者可能是这个SQLite列类型有多灵活/可追溯?

  • rowid 及其别名列必须是整数。尽管通常允许 SQLite 分配值。

在创建表 SQL 中定义列时,应以编程方式检查数据或使用CHECK约束。

CHECK 约束可以附加到列定义或指定 作为表约束。在实践中,这没有什么区别。每次 将新行插入到表中或更新现有行, 计算和强制转换与每个 CHECK 约束关联的表达式 以与 CAST 表达式相同的方式转换为数值。如果结果 为零(整数值 0 或实值 0.0),则为约束 发生了违规行为。如果 CHECK 表达式的计算结果为 NULL,或者 任何其他非零值,它不是约束冲突。这 CHECK 约束的表达式不能包含子查询。

SQLite 所理解的 SQL - 创建表

考虑以下代码:-

DROP TABLE IF EXISTS mychecktable ;
CREATE TABLE IF NOT EXISTS mychecktable (mycolumn BLOB CHECK(substr(mycolumn,3,1) = '-'));
INSERT INTO mychecktable VALUES('14-03-1900');
INSERT INTO mychecktable VALUES('1900-03-14'); -- ouch 3rd char not -

将产生:-

DROP TABLE IF EXISTS mychecktable
> OK
> Time: 0.187s

CREATE TABLE IF NOT EXISTS mychecktable (mycolumn BLOB CHECK(substr(mycolumn,3,1) = '-'))
> OK
> Time: 0.084s

INSERT INTO mychecktable VALUES('14-03-1900')
> Affected rows: 1
> Time: 0.206s

INSERT INTO mychecktable VALUES('1900-03-14')
> CHECK constraint failed: mychecktable
> Time: 0s
  • 第一次插入成功,第二次插入失败。

通常,您会在应用程序中强制使用正确的格式,但您也可以向表定义添加约束以防止这种情况,例如,

CREATE TABLE users(...,
DoB TEXT CHECK(DATE(DoB) NOT NULL AND DATE(DoB)=DoB)
)

最新更新