php mysql дата/время вопрос

Я создал небольшое приложение, в котором есть управление пользователями, интерфейсная консоль для ввода данных и внутренняя консоль для управления частями интерфейса. Внешний интерфейс добавляет строки в базу данных MySQL с отметкой времени. Серверная часть должна иметь возможность выбирать строки из базы данных между датами X и Y.

Пока все работает, кроме даты, с которой я действительно борюсь.

Ввод SQL внешнего интерфейса выглядит следующим образом (упрощено с удаленным ложным кодом):

$date = time();
$top_level_category = $_POST['top_level_category'];
$sub_level_category = $_POST['sub_level_category'];
$company = $_POST['company'];
$agent_name = $_POST['agent_name'];
$ticket_id = $_POST['ticket_id'];

$sql = "INSERT INTO dacc_data ("
     .     "id, top_level_category, sub_level_category, "
     .     "agent_name, date, ticket_id, company"
     . ") VALUES ("
     .     "NULL, '$top_level_category', '$sub_level_category', "
     .     "'$agent_name', FROM_UNIXTIME('$date'), '$ticket_id', '$company'"
     . ")"
;

$result = mysql_query($sql) or die (mysql_error());  

Кажется, это работает нормально, метка времени подбирается и добавляется в столбец DATETIME в моей таблице. В базе данных он отображается как дд/мм/гггг чч:мм:сс.

Итак... мой первый вопрос - это правильный способ сделать это?

Второй вопрос заключается в том, какой оператор SQL мне понадобится для извлечения массива строк между датами X и Y.

Извините, если это немного бессвязно, надеюсь, это ясно, но если вам нужна дополнительная информация, дайте мне знать.


person suitedupgeek    schedule 02.12.2008    source источник
comment
Не могли бы вы уточнить, это правильный способ сделать это? Достигаете ли вы желаемых результатов? Если нет, то каких результатов вы хотите достичь?   -  person Thomas Owens    schedule 02.12.2008
comment
вы можете не добавлять mysql_real_escape_string к своим сообщениям, чтобы остановить инъекцию   -  person Re0sless    schedule 02.12.2008


Ответы (3)


Дата и время MySQL должны быть отформатированы тире:

ГГГГ-ММ-ДД ЧЧ:ММ:СС

http://dev.mysql.com/doc/refman/5.0/en/datetime.html

Затем вы можете запросить диапазоны дат несколькими способами:

select *
from table
where date >= '[start date]' and date <= '[end date]';

or

select * 
from table 
where date between '[start date]' and '[end date]';

где "таблица" — это имя таблицы вашей базы данных, а "дата" — это имя вашего поля даты и времени.

person Tim    schedule 02.12.2008
comment
В этом может помочь DATE_SUB / DATE_ADD — так же, как strtotime('+4 days') в php или использование mktime, он позволяет забыть о том, сколько дней в месяце. - person benlumley; 02.12.2008

Ты прав. Я могу подтвердить, что в базе данных есть "ГГГГ-ММ-ДД ЧЧ:ММ:СС" - я использую редактор SQLWave для быстрого просмотра БД, он автоматически форматирует столбец DATETIME.

// Initial questions still stand :)

Или нет, только что заметил, что вы обновили ответ - большое спасибо! На самом деле я несколько раз пробовал один и тот же запрос безрезультатно, в основном потому, что мой WHERE неправильно указывал формат даты. Введен в заблуждение SQLWave :(

Вернемся к использованию командной строки с этого момента !!!

person suitedupgeek    schedule 02.12.2008

«какой оператор SQL мне нужен, чтобы вытащить массив строк между датами X и Y?»

SELECT * FROM `dacc_data` where `date` between "2008-11-01" and "2008-12-01"
person Piskvor left the building    schedule 02.12.2008