我编写了一个函数来重新排列日期格式,以便存储在从d-m-y
到y-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')
我检查过两者都是字符串,查询看起来是正确的。为什么他们存储不同?
答案 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
'。作为
YYYYMMDD
或YYMMDD
格式的数字,前提是该数字作为日期有意义。例如,19830905
和830905
是 解释为“1983-09-05
”。