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

时间:2019-03-25 20:05:05

标签: sqlite

我创建了一个表格,其中有日期类型的“出生日期”列。问题是我可以插入任何东西,并且已成功完成。我希望该字段限制诸如插入字符串之类的机会,而不要限制相关人员。 insertions wrongResults

我一直在寻找解决方案,但是我只能找到用于获取当前时间的不同格式的代码。我也不清楚修饰符的工作原理(https://www.sqlite.org/lang_datefunc.html)。

2 个答案:

答案 0 :(得分:1)

禁止 rowid 列或 rowid 列的别名,任何类型的值都可以存储在一种类型的列中。那是列的类型并不限制/约束可以存储的数据。

在CREATE TABLE SQL中定义列时,您应该以编程方式检查数据或交替使用 CHECK 约束。

  

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

SQL As Understood By SQLite - CREATE TABLE

示例

考虑以下代码:-

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 -

该is将导致:-

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
  • 即第一次插入成功,第二次插入失败。

答案 1 :(得分:0)

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

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