В MySQL, как бы я сравнил сегодняшнюю дату с датой в моей таблице базы данных?
Я создаю веб-приложение для беременных женщин (для моего курса веб-разработки в колледже)
, и в моей базе данных хранится дата зачатия каждого пользователя.
В своем приложении я беру дату зачатия, сравниваю ее с сегодняшним днем и даю пользователю немного информации об этом моменте их беременности.
В моей базе данных также есть таблица, в которой содержится запись для каждой "Стадии" беременности (т. Е. Стадия 1 = 1-2 месяца, Стадия 2 = 2-3 месяца и т.д.)
Итак, как бы я структурировал свой запрос MySQL? Это то, с чем я пытался работать...
SELECT s.id as stageid , p.id as patientid , s.name , s.nutritioninfo , s.commonsymptoms , p.conceptiondate FROM stage s, patient p WHERE p.id=? AND TO_DAYS(p.conceptiondate)=To_DAYS(NOW());,
Последняя строка (часть TO_Days()=TO_DAYS()
) выше - это та часть, где я борюсь.
Было бы разумно хранить строку для даты начала и даты окончания для каждого этапа в моей таблице "Этап"?
Но тогда как это будет работать, если у всех моих пользователей будут разные даты зачатия?
Я буду использовать этот запрос на php, а затем использовать этот PHP-запрос в своем интерфейсе, который встроенный в ExtJS.
2 answers
Ваш запрос
SELECT s.id as stageid
, p.id as patientid
, s.name
, s.nutritioninfo
, s.commonsymptoms
, p.conceptiondate
FROM stage s, patient p
WHERE p.id=? and TO_DAYS(p.conceptiondate)=To_DAYS(NOW());,
Есть пара проблем:
- Не используйте синтаксис неявного соединения (соединения с использованием where), это сбивает с толку и обесценивается; всегда используйте явные соединения! см. ниже.
- Нигде в вашем запросе нет критерия соединения, при котором поле из
stage s
соединяется с полем изpatient p
, например(join on p.x = s.y)
- Я бы рекомендовал не использовать отдельные дни в вашей базе данных этапов. Используйте диапазоны вместо замены поля
stage.stageday
на 2 поляstage.startday
иstage.endday
Вот мое предложение:
SELECT s.id as stageid , p.id as patientid , s.name , s.nutritioninfo , s.commonsymptoms , p.conceptiondate FROM patient p INNER JOIN stage s ON (DATEDIFF(CURDATE(), p.conceptiondate) BETWEEN s.startday AND s.endday) WHERE p.id=?
Здесь используется явный синтаксис соединения cf ANSI 92, который четко показывает, как соединяются две таблицы.
Я добавил два новых поля startday
и endday
, теперь вам нужно определить только 1 строку на фазу беременности. У вас даже могут быть перекрывающиеся фазы.
0 = день зачатия, 196 должно быть днем рождения. Не забудьте включить достаточное количество дополнительных дней на случай поздних родов:-).
Я бы не держал фактические "даты" в промежуточной таблице, а начинал и заканчивал дни... Пример: первый месяц будет с 0 по 30 день... Второй месяц с 31-го по 60-й день и т.д.
Затем ваш запрос может запросить, где (синтаксис psuedo)
current_date() between Conception + Stage.StartDays
and Conception + Stage.StopDays
В MySQL его синтаксис будет
date_add( Conception, interval Stage.StartDays day ) as an example.
Таким образом, один человек, зачавший 1 января, был бы в 4 месяце, а кто-то, зачавший вчера, был бы в первом месяце (или нулевом, в зависимости от того, как классифицируются "месяцы").