为什么我应该在SQL中使用日期时间



我正在测试是否可以将字符串传递到sqlite数据库中的下表中:

CREATE TABLE TIMES(
    ID              INT             PRIMARY KEY                 ,
    TIME_START      DATETIME        DEFAULT CURRENT_TIMESTAMP   ,
    TIME_STOP       DATETIME                                    ,
    CONSTRAINT FUTURE_DATE CHECK
        (TIME_START >= CURRENT_TIMESTAMP AND TIME_STOP >= CURRENT_TIMESTAMP)
);

因此:

INSERT INTO TIMES VALUES (1, "2016-07-31 07:08:00", NULL)

它通过了,没问题。我看到这个有点震惊,所以我尝试了另一个值:

INSERT INTO TIMES VALUES (2, "9999999999 07:08:00", NULL)

它也通过了。这让我很担心,因为它应该只允许DATETIME值,而不是一堆数字。我尝试了一些其他值:

INSERT INTO TIMES VALUES (3, "9999999999:::::::::", NULL);
INSERT INTO TIMES VALUES (4, "9999999999 99:99:99", NULL);
INSERT INTO TIMES VALUES (6, "this is some really random text", NULL);
INSERT INTO TIMES VALUES (6, "9999999999999999999", NULL);

除最后一个外,其他都奏效了。我的问题是,当它不能验证传入的数据类型时,为什么要使用日期时间?不能只使用CHAR(事实上,CHARDATETIME有更多的约束,它限制了字符数量)?

所有这些都在上进行了测试

  • http://sqliteonline.com/
  • Python的sqlite3

SQLite使用动态类型;无论您使用的是DATETIME、CHAR cco还是FLUFFY BUNNIES。

如果你想强制一个值是任何支持的格式,你可以添加一个显式约束来检查一些内置的日期函数是否能够解析它:

CREATE TABLE Times(
    Time_Stop  DATETIME  CHECK (date(Time_Stop) IS NOT NULL),
    [...]
);

和CHAR(x)不限制长度。

相关内容

  • 没有找到相关文章

最新更新