2012-01-11 2 views
0

Моих запросов выглядит следующим образомПытаясь найти запись между двумя датами

WHERE `Project`.`user_id` = 9 
    AND `Project`.`project_status` = 1 
    AND `Project`.`project_type_id` = 4 
    AND `Project`.`approval_date` >= '01/08/2012' 
    AND `Project`.`approval_date` <= '01/12/2012' 

У меня есть запись, которая соответствует этим критериям, я на самом деле создал запрос, основанный на одной из записей, но он не возвращается. Я действительно не хочу использовать BETWEEN, потому что приложение может использовать либо дату начала, либо дату окончания.

+2

какой тип данных вы используете для поля «approcription_date» – calumbrodie

+0

Попробуйте применить каждый критерий поиска по очереди, пока строки не будут возвращены, что поможет найти проблему. Трудно ответить на ваш вопрос без некоторых выборочных данных. – Tony

+0

@ kissmyface - на основе предыдущих вопросов OP - http://stackoverflow.com/questions/8764015/finding-records-that-have-dates-that-fall-before-the-date-7-days-from-now - это столбец datetime –

ответ

2

Вы должны конвертировать '01/08/2012 'и '01/12/2012' в значения даты и времени MySQL, используя STR_TO_DATE()

например

STR_TO_DATE('01/08/2012', '%d/%m/%Y') 
+0

, которые могут работать. только проблема в том, что мне нужно форматировать datetime, я пытался tweeking то, что вы сказали, но он не работал. 'Project.project_type_id = 4 И Project.approval_date> = STR_TO_DATE ('01/02/2012 ','% Y-% m-% d% H:% i:% s ') AND Project.authorized_date <= STR_TO_DATE ('01/26/2012 ','% Y-% m-% d% H:% i:% s ') ' – numerical25

+0

Вы должны определить маску формата, соответствующую фактическому формату вашей строки даты –

1

Ну, это действительно только часть запроса - любой, «между» работает по-другому, чем вы подразумеваете - вот выдержка из руководства MySQL:

• выраж МЕЖДУ мин и макс If выраж больше или равно min, а expr меньше или равно max, BETWEEN возвращает 1, в противном случае оно возвращает 0. Это эквивалентно выражению (min < = expr AND expr < = max), если все аргументы имеют один и тот же тип. В противном случае преобразование типа происходит в соответствии с правилами, описанными в разделе 11.2, «Преобразование типов в оценке выражений», но применяется ко всем трем аргументам.

Все это в сторону, каков тип данных столбца «authorized_date»?

+0

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

1

Это выглядит так, как будто он должен работать на первый взгляд, однако значения, которые вы предоставили , недействительны по времени. Попробуйте это вместо

WHERE `Project`.`user_id` = 9 
AND `Project`.`project_status` = 1 
AND `Project`.`project_type_id` = 4 
AND `Project`.`approval_date` >= '2012-01-08 00:00:00' 
AND `Project`.`approval_date` <= '2012-01-12 00:00:00' 
+0

Хорошо, вот что мне хотелось бы. Можно ли использовать функцию 'STR_TO_DATE()' для преобразования в формат datetime? потому что я хотел бы фактор времени. – numerical25

+0

Я попытался использовать php date() для форматирования даты. 'date (" Y-m-d H: i: s ", $ start);' Я использую JQUERY для получения даты. значение $ start = 01/02/2012. по какой-то причине я получаю следующую ошибку: «Неверное сформированное числовое значение встречается», а php возвращает отформатированную дату '' 1969-12-31 19: 00: 01' – numerical25

+0

. Вы используете jQuery UI datepicker? – calumbrodie

0

вы все еще можете использовать BETWEEN

WHERE `Project`.`user_id` = 9 
AND `Project`.`project_status` = 1 
AND `Project`.`project_type_id` = 4 
AND (`Project`.`approval_date` BETWEEN '2012-01-08 00:00:00' AND '2012-01-12 23:59:59') 
+0

Я могу по-прежнему использовать промежуток между ними, когда иногда конечная дата или дата начала недоступны. – numerical25

0

Моя главная проблема становится строка для форматирования в DateTime. kissmyface был прав, просто структурировав его правильно, чтобы mysql мог понять. Поэтому я использовал php, чтобы преобразовать его перед отправкой.

"Project.approval_date >= '".date("Y-m-d H:i:s", strtotime($start))."'"; 
"Project.approval_date <= '".date("Y-m-d H:i:s",strtotime($end))."'"; 

Это было в значительной степени мое решение. если кто-то не знает, что делать точно так же на стороне mysql.