2014-09-09 8 views
1

Я работаю над проектом, где есть куча дат, которые мне нужно хранить в базе данных (MySQL).Сохранить полную дату или просто год в базе данных

Проблема в том, что некоторые даты полны, но некоторые даты - всего лишь год.

Например, даты, как это:

  • 20 января 1980
  • 25 февраля 2012

Я использую функцию date() и strtotime() функции в PHP для преобразования дат в формате Y-m-d. Полные даты конвертируются успешно, но даты всего лишь за год преобразуются в сегодняшнюю дату, что неверно.

Вопросов:

  • Как успешно определить, является полная дата и которая только лишь год в PHP, а затем применить функцию date() и strtotime() только полную дату?
  • Как сохранить эти варианты (полная дата и только год) в базе данных? (если это возможно в одном столбце)
  • При получении из базы данных, как узнать, заполнена ли дата или всего лишь год и отобразить ее соответственно?

Edit:

Confused. Я буду выполнять операции с датой, такие как сортировка по дате, которая будет включать как полные, так и только даты года. До:

  • Хранить год как 1990-00-00 и проверять нули при извлечении?
  • Храньте год как 1990-01-01 и еще одно булевское поле isYear?
  • Сохранить год, месяц и день как целые числа в разных столбцах?
+1

Использовать PHP '' DateTime' и MySQL 'DATETIME', не делайте этого беспорядочного материала из каменного века. – DanFromGermany

+0

Многие варианты делают выбор более трудным :-) Не волнуйтесь. Ни один из трех приведенных вариантов не очень-то плох. Просто выберите тот, который, по вашему мнению, может быть лучшим и использовать его. –

ответ

0

Вы можете проверить, если данная строка указывает только год, передавая его date_create_from_format:

$s = '2014'; 
if (date_create_from_format('Y', $s)) 
    $t = strtotime($s.'-01-01'); 
else 
    $t = strtotime($s); 

echo date('Y-m-d H:i:s', $t); 
0

Убедитесь, что вы используете нули в неизвестных частях даты. Поэтому вставьте '2014-00-00' вместо 2014 года.

+0

Является ли эта дата как 2014-00-00 приемлемой в базе данных MySQL? Если да, то как определить, является ли дата только годом или полной датой в PHP перед выполнением этой операции? – Forthaction

+0

Да, это приемлемо, это его красота, вы можете просто использовать существующую колонку. Вы можете добавить -00-00 к датам, которые являются только годами. Когда вы его выберете, вы можете проверить, заканчивается ли оно с -00-00, чтобы увидеть, что это год вместо полной даты. –

0

Вы можете проверить, является ли это номером. Если это правда, то это год. Поэтому добавьте «01/01 /», прежде чем преобразовать его в дату. Это будет рассматриваться как событие в январе. Вам нужно отдельное поле isYear (boolean), чтобы определить, что это год или дата.

0

Чтобы сохранить разные форматы дат в одном столбце в db, вам нужно сохранить их как строку. Это не имеет смысла, если вы хотите сделать некоторые операции над ними, но это нормально, если вы просто хотите отобразить значение. При этом, если вы хотите выполнить некоторые операции над ними, я предлагаю иметь 2 столбца в db, один для полного года типа TIMESTAMP и 1 для года как тип YEAR. Таким образом, вы также знаете, какой тип вы загружаете, проверяя, какой столбец не является нулевым и поэтому решает другой вопрос.

Чтобы ответить на ваш первый вопрос, вы можете проверить, какая из них является полной, и только год, проверив длину строки. Если обрезанная строка длиннее 4 символов, то это должна быть полная дата. Тем не менее, я бы сделал обработку ошибок, если у вас есть некорректно отформатированные данные, отправленные вам.

чтение других ответов, я бы не установил его до 01/01/2014, потому что, если у вас есть фактическая дата 01/01/2014, вы не можете определить, была ли она отправлена ​​как полная дата или только год , В качестве альтернативы вы можете следовать этому методу и добавить столбец типа BIT для представления булева о том, было ли это fullYear

0

Если формат полных дат согласован, вы можете проверить, есть ли полная дата, проверяя пробелы в строке.

Во-вторых, если у вас есть столбец даты в таблице, вы можете сохранить только значение года и оставить месяц и день нулями.

if (strstr(trim($date), ' ') !== false) { 
    // space was found, this is a full date 
    $mysqlDate = /* ... strtotime, etc. */ 
} else { 
    // space was not found, this is just a year date 
    $mysqlDate = trim($date) . '-00-00'; 
} 

Когда дело доходит до выбора, вы можете отфильтровать даты в год только путем проверки нулей в значении даты.

Не очень красивое решение, но тот, который подскакивает, если вы намерены хранить их все в одной колонке.

1

В базе данных вы храните объекты, с которыми имеете дело. Вы можете хранить имена типа «Джон Смит» так же, как и есть, или вы храните имя и фамилию отдельно (но где вместо этого следует указать второе имя? :-) Это зависит от ваших требований. Для одной системы необходимо фильтровать и сортировать по фамилиям, поэтому фамилия должна быть отдельным столбцом. Другая система может быть заинтересована только в полном имени без забот, чтобы беспокоиться о том, что в «Ву Чанг» является первым и которое является фамилией.

То же самое здесь. Обычно один хранит даты как столбец DATE или DATETIME. Но вас интересует год, когда день и месяц могут быть неизвестны. Поэтому вы храните их отдельно. Год, вероятно, с ограничением NOT NULL, а день и месяц - нулевыми.

Я рекомендую отдельные целые столбцы для месяца и месяца. Не используйте строку с определенным форматом, который нужно знать и который может быть поврежден время от времени.

EDIT: Я просто замечаю, что я не ответил на ваш вопрос PHP: ну, когда вы получаете строку, состоящую из четырех цифр, это год, иначе вы можете либо преобразовать ее на дату, либо это дата, либо вы не может, то это недопустимые данные.

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