Re: Создание запроса и операции с датами
А какую функцию использовать для этого, если в period хранить месяцы (тип INT)?
Вы не вошли. Пожалуйста, войдите или зарегистрируйтесь.
Форум PHP-MyAdmin.RU → MySQL & phpMyAdmin → Создание запроса и операции с датами
Чтобы отправить ответ, вы должны войти или зарегистрироваться
А какую функцию использовать для этого, если в period хранить месяцы (тип INT)?
А какую функцию использовать для этого, если в period хранить месяцы (тип INT)?
DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH) AS `vac_period`
Ага, забыл сразу MONTH поставить, поэтому не сработало.
Теперь создал запрос выбирающие все даты этого месяца этого года.
SELECT "people"."name" , "people"."surname" , "people"."fathername" , "contacts"."name" AS "contact_name" , "contacts"."value" AS "contact_value" , "flg"."next_date" , "vaclist"."vac_name" AS "vaclist_vac_name" , DATE_ADD("vac"."date", INTERVAL "vaclist"."period" MONTH) AS "vac_date_plus" ,
"vac"."next_place" ,
DATE_ADD("orders"."done_date", INTERVAL 6 MONTH) AS "done_date_plus"
FROM "people"
INNER JOIN (
"contacts" , "flg" , "vac" , "vaclist" , "disp" , "orders"
) ON ( "people"."id" = "contacts"."man_id"
AND "people"."id" = "flg"."man_id"
AND "people"."id" = "vac"."man_id"
AND "vaclist"."id" = "vac"."vaclist_id"
AND "people"."id" = "disp"."man_id"
AND "orders"."disp_id" = "disp"."id" )
WHERE "contacts"."index" = 'yes'
AND "vac"."next_place" = 'поликлиника № 2'
AND "next_date" > '01.05.11'
AND "next_date" < '31.05.11'
AND DATE_ADD("vac"."date", INTERVAL "vaclist"."period" MONTH) > '01.05.11'
AND DATE_ADD("vac"."date", INTERVAL "vaclist"."period" MONTH) < '31.05.11'
AND DATE_ADD("orders"."done_date", INTERVAL 6 MONTH) > '01.05.11'
AND DATE_ADD("orders"."done_date", INTERVAL 6 MONTH) < '31.05.11'
Но в одном из полей выводится 01.05.09 Почему?
Но в одном из полей выводится 01.05.09 Почему?
Неверный формат дат. Даты должны иметь вид: 2011-05-01 (год из четырех цифр, дефис, месяц из двух цифр, дефис, день из двух цифр).
Исправил и постарался поправить, чтобы была возможность выбирать человека, у которого, например, только одна дата из трех приходится на этот месяц
SELECT `people`.`name` , `people`.`surname` , `people`.`fathername` , `contacts`.`name` AS `contact_name` , `contacts`.`value` AS `contact_value` , `flg`.`next_date` , `vaclist`.`vac_name` AS `vaclist_vac_name` , DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH) AS `vac_date_plus` ,
`vac`.`next_place` ,
DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH) AS `done_date_plus`
FROM `people`
INNER JOIN (
`contacts` , `flg` , `vac` , `vaclist` , `disp` , `orders`
) ON ( `people`.`id` = `contacts`.`man_id`
AND `people`.`id` = `flg`.`man_id`
AND `people`.`id` = `vac`.`man_id`
AND `vaclist`.`id` = `vac`.`vaclist_id`
AND `people`.`id` = `disp`.`man_id`
AND `orders`.`disp_id` = `disp`.`id` )
WHERE `contacts`.`index` = "yes"
AND `vac`.`next_place` = "поликлиника № 2"
AND `next_date` > "2011-05-01"
AND `next_date` < "2011-05-31"
OR `contacts`.`index` = "yes"
AND `vac`.`next_place` = "поликлиника № 2"
AND DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH) < "2011-05-31"
AND DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH) > "2011-05-01"
OR `contacts`.`index` = "yes"
AND `vac`.`next_place` = "поликлиника № 2"
AND DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH) > "2011-05-01"
AND DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH) < "2011-05-31"
Но в поле vac_date_plus выдается 2021 год и не все люди просматриваются, где что не так?
в поле vac_date_plus выдается 2021
Смотрите в каком виде хранится значение из поля `vaclist`.`period` при таком выводе.
не все люди просматриваются
Это я не могу точно сказать, но обратите внимание на условия. При использовании в условии AND и OR, обязательно используйте скобки для определения места действия этих условий. Пример постановки скобок (пример не рабочий, дан для объяснения).
WHERE `contacts`.`index` = "yes"
AND (`vac`.`next_place` = "поликлиника № 2"
AND `next_date` > "2011-05-01"
AND `next_date` < "2011-05-31"
OR `contacts`.`index` = "yes")
AND (`vac`.`next_place` = "поликлиника № 2"
AND DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH) < "2011-05-31"
AND DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH) > "2011-05-01"
OR `contacts`.`index` = "yes")
AND (`vac`.`next_place` = "поликлиника № 2"
AND DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH) > "2011-05-01"
AND DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH) < "2011-05-31")
В `vaclist`.`period` данные хранятся в типе int(10) в моем случае там как раз хранится 10 летний срок - то есть 120 (месяцев). Суть в том, что прибавляется правильно, а потом получившиеся данные неправильно фильтруются.
Поставил в скобки все, что только можно, проследил включение первых и последних чисел интервала:
SELECT `people`.`name` , `people`.`surname` , `people`.`fathername` , `contacts`.`name` AS `contact_name` , `contacts`.`value` AS `contact_value` , `flg`.`next_date` , `vaclist`.`vac_name` AS `vaclist_vac_name` , DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH) AS `vac_date_plus` ,
`vac`.`next_place` ,
DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH) AS `done_date_plus`
FROM `people`
INNER JOIN (
`contacts` , `flg` , `vac` , `vaclist` , `disp` , `orders`
) ON ( `people`.`id` = `contacts`.`man_id`
AND `people`.`id` = `flg`.`man_id`
AND `people`.`id` = `vac`.`man_id`
AND `vaclist`.`id` = `vac`.`vaclist_id`
AND `people`.`id` = `disp`.`man_id`
AND `orders`.`disp_id` = `disp`.`id` )
WHERE `contacts`.`index` = "yes"
AND
((`next_date` >= "2011-05-01"
AND `next_date` <= "2011-05-31"
AND `vac`.`next_place` = "поликлиника № 2"
AND (DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH)) <= "2011-05-31"
AND (DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH)) >= "2011-05-01"
AND (DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH)) >= "2011-05-01"
AND (DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH)) <= "2011-05-31")
OR
(`vac`.`next_place` = "поликлиника № 2"
AND (DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH)) <= "2011-05-31"
AND (DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH)) >= "2011-05-01"
AND (DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH)) >= "2011-05-01"
AND (DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH)) <= "2011-05-31")
OR
(`next_date` >= "2011-05-01"
AND `next_date` <= "2011-05-31"
AND (DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH)) >= "2011-05-01"
AND (DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH)) <= "2011-05-31")
OR
(`next_date` >= "2011-05-01"
AND `next_date` <= "2011-05-31"
AND `vac`.`next_place` = "поликлиника № 2"
AND (DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH)) <= "2011-05-31"
AND (DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH)) >= "2011-05-01")
OR
(`next_date` >= "2011-05-01"
AND `next_date` <= "2011-05-31")
OR
(`vac`.`next_place` = "поликлиника № 2"
AND (DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH)) <= "2011-05-31"
AND (DATE_ADD(`vac`.`date`, INTERVAL `vaclist`.`period` MONTH)) >= "2011-05-01")
OR
((DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH)) >= "2011-05-01"
AND (DATE_ADD(`orders`.`done_date`, INTERVAL 6 MONTH)) <= "2011-05-31"))
Однако ничего не изменилось, в одном из полей выводится 11.05.2021, а все даты от еще одного человека, по-видимому отфильтровываются.
vac_date_plus выводит 2021 год, что вроде правильно, если вы прибавляете 120 месяцев.
По остальному я даже не знаю что посоветовать, кроме как: пробуйте упростить запрос, пока он не начнет выводить нужные данные хотя бы только по одному полю, а дальше добавляйте постепенно.
Чтобы отправить ответ, вы должны войти или зарегистрироваться
Форум PHP-MyAdmin.RU → MySQL & phpMyAdmin → Создание запроса и операции с датами
Форум работает на PunBB, при поддержке Informer Technologies, Inc
Currently installed 7 official extensions. Copyright © 2003–2009 PunBB.