В 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.

Author: Johan, 2011-04-27

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());,

Есть пара проблем:

  1. Не используйте синтаксис неявного соединения (соединения с использованием where), это сбивает с толку и обесценивается; всегда используйте явные соединения! см. ниже.
  2. Нигде в вашем запросе нет критерия соединения, при котором поле из stage s соединяется с полем из patient p, например (join on p.x = s.y)
  3. Я бы рекомендовал не использовать отдельные дни в вашей базе данных этапов. Используйте диапазоны вместо замены поля 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 должно быть днем рождения. Не забудьте включить достаточное количество дополнительных дней на случай поздних родов:-).

 3
Author: Johan, 2011-04-27 19:05:02

Я бы не держал фактические "даты" в промежуточной таблице, а начинал и заканчивал дни... Пример: первый месяц будет с 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 месяце, а кто-то, зачавший вчера, был бы в первом месяце (или нулевом, в зависимости от того, как классифицируются "месяцы").

 3
Author: DRapp, 2011-04-27 17:50:35