插入DATE意外行为。为什么?

时间:2017-01-22 13:12:16

标签: php mysql

我编写了一个函数来重新排列日期格式,以便存储在从d-m-yy-d-m的数据库中。具有原始日期的原始字符串与insert查询一起正确存储,但格式化的字符串不是。

表格结构:

+-------+------+
| Field | Type |
+-------+------+
| id    | INT()|
+-------+------+
| date1 | DATE |
+-------+------+
| date2 | DATE |
+-------+------+

PHP:

<?php
$db = new mysqli("localhost","root","","test");
function date2Store($date) {
    $dateFormat = DateTime::createFromFormat('d-m-y',$date);
    return $dateFormat->format('y-d-m');
}
$dateRaw = "22-01-17";
$dateFormatted = date2Store($dateRaw);
echo $dateFormatted; // Checking how the string looks
$query = "INSERT INTO dateTest(date1,date2) VALUES ('$dateFormatted','$dateRaw')";
echo $query; // Checking how the query looks
$db->query($query);
?>

结果是:

+----+------------+------------+
| id |  date1     |   date2    |
+----+------------+------------+
| 1  | 0000-00-00 | 2022-01-17 |
+----+------------+------------+

$ query打印:

INSERT INTO dateTest(date1,date2) VALUES ('17-22-01','22-01-17')

我检查过两者都是字符串,查询看起来是正确的。为什么他们存储不同?

1 个答案:

答案 0 :(得分:2)

17-22-01不是有效日期,因此 - 根据MySQL服务器的配置 - 它不会存储在DATE类型的字段中。

如果要存储源格式(不是有效的mysql日期格式),可以使用其他字段类型,p.e。 varchar

查看here into the MySQL manual以了解MySql允许的日期格式 - 因此可以在INSERT声明中使用:

  

MySQL以这些格式识别DATE值:

     
      
  • 作为“YYYY-MM-DD”或“YY-MM-DD”格式的字符串。允许使用“宽松”语法:可以使用任何标点符号   作为日期部分之间的分隔符。例如,'2012-12-31',   “2012/12/31”,“2012^12^31”和“2012@12@31”等效。

  •   
  • 作为一个没有“YYYYMMDD”或“YYMMDD”格式的分隔符的字符串,前提是该字符串作为日期有意义。例如,   “20070523”和“070523”被解释为“2007-05-23”,但“071332”   是非法的(它有无意义的月和日部分)并成为   '0000-00-00'。

  •   
  • 作为YYYYMMDDYYMMDD格式的数字,前提是该数字作为日期有意义。例如,19830905830905是   解释为“1983-09-05”。

  •