MySQL 和日期时间

Lie*_*uwe 3 mysql datetime

如果我有一个包含 DATETIME 列的表,我可以插入格式如下的日期:

2015-03-25 10:10:10
2015-03-25 10:10
2015-03-25 10
2015-03-25 
Run Code Online (Sandbox Code Playgroud)

它将用零填充余数。但我不能使用

2015-03 
2015
Run Code Online (Sandbox Code Playgroud)

因为它会给出“日期时间值不正确”错误。然而,可以在 SELECT 中使用最后两个,例如[..] WHERE timestamp < '2015-03'..

如果在日期时间中省略,MySQL 是否可以用 01-01 来填充日期时间的其余部分,或者我必须自己手动执行此操作?

即我想在 INSERT 语句中使用“2015-03”,或者执行类似的操作SELECT DATE_FORMAT('2015-03', '%Y%m%dT%H%i%S')

egg*_*yal 5

如日期和时间文字中所述:

\n\n
\n

MySQL 识别DATE以下格式的值:

\n\n
    \n
  • \'YYYY-MM-DD\'作为或格式的字符串\'YY-MM-DD\'。允许使用 \xe2\x80\x9crelaxed\xe2\x80\x9d 语法:任何标点符号都可以用作日期部分之间的分隔符。例如,\'2012-12-31\'\'2012/12/31\'\'2012^12^31\'\'2012@12@31\'是等效的。

  • \n
  • 作为不带分隔符的字符串,格式为 或\'YYYYMMDD\'\'YYMMDD\'前提是该字符串作为日期有意义。例如,\'20070523\'\'070523\'被解释为\'2007-05-23\',但是\'071332\'非法的(它具有无意义的月份和日期部分)并变为\'0000-00-00\'

  • \n
  • YYYYMMDD作为或格式的数字YYMMDD,前提是该数字作为日期有意义。例如,19830905830905被解释为\'1983-09-05\'

  • \n
\n\n

MySQL 可识别以下格式的值DATETIMETIMESTAMP

\n\n
    \n
  • \'YYYY-MM-DD HH:MM:SS\'作为或格式的字符串\'YY-MM-DD HH:MM:SS\'。这里也允许使用 \xe2\x80\x9crelaxed\xe2\x80\x9d 语法:任何标点符号都可以用作日期部分或时间部分之间的分隔符。例如,\'2012-12-31 11:30:45\'\'2012^12^31 11+30+45\'\'2012/12/31 11*30*45\'\'2012@12@31 11^30^45\'是等效的。

    \n\n

    日期和时间部分与秒小数部分之间唯一可识别的分隔符是小数点。

    \n\n

    日期和时间部分可以用空格分隔,T而不能用空格分隔。例如,\'2012-12-31 11:30:45\' \'2012-12-31T11:30:45\'是等价的。

  • \n
  • 作为不带分隔符的字符串,格式为 或\'YYYYMMDDHHMMSS\'\'YYMMDDHHMMSS\'前提是该字符串作为日期有意义。例如,\'20070523091528\'\'070523091528\'被解释为\'2007-05-23 09:15:28\',但是\'071122129015\'非法的(它有一个无意义的微小部分)并变为\'0000-00-00 00:00:00\'

  • \n
  • YYYYMMDDHHMMSS作为或格式的数字YYMMDDHHMMSS,前提是该数字作为日期有意义。例如,19830905132800830905132800被解释为\'1983-09-05 13:28:00\'

  • \n
\n
\n\n

值得注意的是,MySQL不支持您希望使用的不完整格式。

\n\n

MySQL碰巧接受您尝试过的一些不完整格式(显然是通过用零填充)是未记录的行为,很可能是开发人员无意的。它不能也不应该)被依赖,尤其是因为可能存在导致行为中断的边缘情况;或者因为在未来的版本中该行为可能会在没有警告的情况下发生更改。

\n\n

如果绝对有必要向 MySQL 提供此类不完整的临时文字(其实不应该如此,因为您的数据访问层应该了解它正在处理的值的类型,并以受支持的格式将它们提供给 MySQL) ),你可以使用它的STR_TO_DATE()函数来相应地解析它们:

\n\n
\n

未指定的日期或时间部分的值为 0,因此str中不完整指定的值会产生部分或全部部分设置为 0 的结果:

\n\n
mysql> SELECT STR_TO_DATE(\'abc\',\'abc\');\n        -> \'0000-00-00\'\nmysql> SELECT STR_TO_DATE(\'9\',\'%m\');\n        -> \'0000-09-00\'\nmysql> SELECT STR_TO_DATE(\'9\',\'%s\');\n        -> \'00:00:09\'
Run Code Online (Sandbox Code Playgroud)\n\n

对日期值部分的范围检查如第 11.3.1 节 \xe2\x80\x9cDATE、DATETIME 和 TIMESTAMP 类型\xe2\x80\x9d中所述。例如,这意味着允许 \xe2\x80\x9czero\xe2\x80\x9d 日期或部分值为 0 的日期,除非 SQL 模式设置为不允许此类值。

\n
\n\n

因此,例如,您可以使用:

\n\n
STR_TO_DATE(\'2015-03\', \'%Y-%m\');\n
Run Code Online (Sandbox Code Playgroud)\n