• 首页
  • vue
  • TypeScript
  • JavaScript
  • scss
  • css3
  • html5
  • php
  • MySQL
  • redis
  • jQuery
  • 使用DATE列的问题

    DATE值的格式为。根据标准SQL,不允许使用其他格式。您应该在表达式和语句子句中使用此格式。例如:'YYYY-MM-DD'UPDATEWHERESELECT

    SELECT * FROM t1 WHERE date >= '2003-05-05';
    

    为了方便起见,如果在数字上下文中使用日期,MySQL会自动将日期转换为数字,反之亦然。MySQL还允许“放松”更新和当字符串格式的WHERE一个日期时的条款DATEDATETIMETIMESTAMP列。“宽松”格式表示任何标点符号都可以用作部分之间的分隔符。例如,'2004-08-15''2004#08#15'是等效的。MySQL也可以转换不包含分隔符的字符串(例如'20040815'),只要它可以作为日期即可。

    当您比较DATETIMEDATETIME,或TIMESTAMP成一个常量字符串用<<==>=>,或BETWEEN运营商,MySQL通常字符串到内部长整型转换更快比较(也为更多的“轻松”的字符串检查)。但是,此转换受以下例外的约束:

    • 比较两列时
    • 当你一个比较DATETIMEDATETIME,或TIMESTAMP列表达式
    • 当您使用除列出的以外的任何比较方法时,例如INSTRCMP()

    对于这些异常,通过将对象转换为字符串并执行字符串比较来完成比较。

    为了安全起见,假设要将字符串与字符串进行比较,则假定将字符串作为字符串进行比较,并使用适当的字符串函数。

    特殊的“零”日期'0000-00-00'可以按以下方式存储和检索:通过连接器/ ODBC使用日期时,由于ODBC无法处理这种日期,因此'0000-00-00'.'0000-00-00'日期会自动转换为NULL

    由于MySQL执行刚刚描述的转换,因此以下语句起作用(假定idate是一DATE列):

    INSERT INTO t1 (idate) VALUES (19970505);
    INSERT INTO t1 (idate) VALUES ('19970505');
    INSERT INTO t1 (idate) VALUES ('97-05-05');
    INSERT INTO t1 (idate) VALUES ('1997.05.05');
    INSERT INTO t1 (idate) VALUES ('1997 05 05');
    INSERT INTO t1 (idate) VALUES ('0000-00-00');
    
    SELECT idate FROM t1 WHERE idate >= '1997-05-05';
    SELECT idate FROM t1 WHERE idate >= 19970505;
    SELECT MOD(idate,100) FROM t1 WHERE idate >= 19970505;
    SELECT idate FROM t1 WHERE idate >= '19970505';
    

    但是,以下语句不起作用:

    SELECT idate FROM t1 WHERE STRCMP(idate,'20030505')=0;
    

    STRCMP()是一个字符串函数,因此它将转换idate为格式的字符串并执行字符串比较。它不会转换为日期并执行日期比较。'YYYY-MM-DD''20030505''2003-05-05'

    如果启用ALLOW_INVALID_DATESSQL模式,MySQL将允许您存储仅进行有限检查的日期:MySQL仅要求日期在1到31之间,月份在1到12之间。这使得MySQL非常适合对于Web应用程序来说很方便,在Web应用程序中您可以在三个不同的字段中获取年,月和日,并且您想存储用户插入的内容(没有日期验证)。

    MySQL允许您存储日期或星期几为零的日期。如果要将生日存储在DATE列中并且只知道日期的一部分,这将很方便。要禁止日期中的零个月或日部分,请启用该NO_ZERO_IN_DATE模式。

    MySQL允许您将“零”值存储'0000-00-00'为“虚拟日期”。”这是在某些情况下比使用更方便NULL的值。如果要存储在DATE列中的日期不能转换为任何合理的值,则MySQL存储'0000-00-00'。要禁用'0000-00-00',请启用该NO_ZERO_DATE模式。

    要让MySQL检查所有日期并仅接受合法日期(除非被覆盖IGNORE),请将sql_mode系统变量设置为"NO_ZERO_IN_DATE,NO_ZERO_DATE"