2017-01-22 2 views
1

Я написал функцию для изменения формата даты для сохранения в базе данных от d-m-y до y-d-m. Необработанная строка с исходной датой корректно сохраняется с запросом на вставку, но форматированная строка - нет.Вставить DATE неожиданное поведение. Зачем?

Структура таблицы:

+-------+------+ 
| 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 | 
+----+------------+------------+ 

за $ печатает запрос:

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

Я проверил, что обе строки, запрос выглядит правильно. Почему они хранят разные?

ответ

2

17-22-01 не является допустимой датой, поэтому - в зависимости от конфигурации вашего сервера MySQL - он не будет храниться в поле с типом DATE.

Если вы хотите сохранить исходный формат, который не является допустимым форматом даты mysql, возможно, используйте другой тип поля, p.e. varchar.

Посмотрите here into the MySQL manual, чтобы выяснить, что дата форматы разрешены MySql - и, следовательно, могут быть использованы в INSERT -statement:

MySQL распознает DATE значения в этих форматах:

  • Как строка в формате «YYYY-MM-DD» или «YY-MM-DD». Разрешен «расслабленный» синтаксис: любой символ пунктуации может использоваться как разделитель между частями даты. Например, '2012-12-31', '2012/12/31', '2012^12^31' и '[email protected]@31' являются эквивалентными.

  • В качестве строки без разделителей в формате «YYYYMMDD» или «YYMMDD» при условии, что строка имеет смысл в качестве даты. Например, «20070523» и «070523» интерпретируются как «2007-05-23», но «071332» является незаконным (он имеет бессмысленный месяц и день) и становится «0000-00-00».

  • В качестве номера в формате YYYYMMDD или YYMMDD при условии, что это число имеет смысл в качестве даты. Например, 19830905 и 830905: интерпретируется как '1983-09-05'.

+0

Хорошо, глупый, я искал ошибку в неправильном направлении. Я форматировал 'y-d-m', когда он' y-m-d'. Спасибо, что указал мне. – MarioZ

Смежные вопросы