Mysql Помогите со сравнением дат MySQL

novi4ok

Новичок
Как дать такой запрос?

Есть таблица
| id | inday | outday | date |
| 1 | 15 | 10 | 2005-12-31 |
| 2 | 15 | 0 | 2005-03-08 |
| 3 | 15 | 0 | 2005-05-01 |

Надо вывести все строки которые попадают в интервал между date-inday (дней) и date+outday (дней), относительно сегоднящнего дня curdate(), предварительно заменив 2005 год на текущий. И чтобы в интервале учитывалось прибавление до следующего года, например если взять строку 1, то диапазон должен получиться 2013-12-24 <==> 2014-12-10.

Возможно ли это только средствами MySQL или как минимум добавкой date("Y") на PHP или большая часть именно программно?

Заранее всем спасибо.
Второй день мучаюсь, не соображу, как упростить.
 

novi4ok

Новичок
Это как бы наброски. Что пробовал.
PHP:
SELECT DATE_FORMAT(hd_date, '2013-%m-%d') AS `data`
     , date_add(DATE_FORMAT(hd_date, '%Y-%m-%d'), INTERVAL -hd_datein DAY) AS datein
     , DATE_FORMAT(date_add(hd_date, INTERVAL +hd_dateout DAY), '%Y-%m-%d') AS dateout
FROM
  bd_name
  
  
  
SELECT DATE_FORMAT(hd_date, '2013-%m-%d') AS `data`
     , date_add(DATE_FORMAT('data', '%Y-%m-%d'), INTERVAL -hd_datein DAY) AS datein
     , DATE_FORMAT(date_add('data', INTERVAL +hd_dateout DAY), '%Y-%m-%d') AS dateout
FROM
  bd_name
WHERE
  hd_show = 1
  AND 'datein' <= 'data' <= 'dateout'
  
  
  
  
  SELECT DATE_FORMAT(hd_date, '2013-%m-%d') AS `data`
     , date_add(DATE_FORMAT(hd_date, '%Y-%m-%d'), INTERVAL -hd_datein DAY) AS datein
     , DATE_FORMAT(date_add(hd_date, INTERVAL + hd_dateout DAY), '%Y-%m-%d') AS dateout, *
FROM
  bd_name
  WHERE
 DATE_ADD('data',INTERVAL -hd_datein DAY) <= 'data' <= ADDDATE('data',INTERVAL - hd_dateout DAY)
 
 
 
 
 SELECT hd_id
	  , DATE_FORMAT(hd_date, '2013-%m-%d') AS `hdata`
     , hd_datein
     , hd_dateout
     , DATE_SUB('hdata',INTERVAL - 'hd_datein' DAY) AS `inday`
     , DATE_SUB('hdata',INTERVAL + 'hd_dateout' DAY) AS `outday`
     , hd_name
     , hd_nametitle
     , hd_img
     , hd_imgalt
     , hd_link
FROM
  bd_name
  
  
  
  SELECT hd_datein
     , hd_dateout
     , hd_date
FROM
  bd_name
 

Фанат

oncle terrible
Команда форума
ну, предпоследний набросок ближе всего к истине. в нем хотя бы от дате форматов в глазах не рябит
плюс совершенно правильно он только выводит даты, а не бежит их не глядя сравнивать.
надо только кавычки убрать от имен полей.
выводит нужные даты в итоге?
 

novi4ok

Новичок
ну, предпоследний набросок ближе всего к истине. в нем хотя бы от дате форматов в глазах не рябит
плюс совершенно правильно он только выводит даты, а не бежит их не глядя сравнивать.
надо только кавычки убрать от имен полей.
выводит нужные даты в итоге?
Не совсем.
Первая строка, в dateout, выводит всё-равно 13-й год, вместо 14-го. Не понимаю почему. Ведь по идее 2013-12-31 + 15 DAY, должно получиться 2014-01-15. А выводит 2013-01-15.
И ещё загвоздка.
Если пытаюсь сравнить curdate() с dateout и datein, выдаёт ошибку.
 

Фанат

oncle terrible
Команда форума
КАК сравнить? КАКУЮ ошибку?
Ты видел здесь табличку "отвечают телепаты, которые видят код на расстоянии"?
 

Фанат

oncle terrible
Команда форума
мне, кстати, безо всякого сравнения ошибку выдаёт, Unknown column 'hdata' in 'field list'
так что использовать заранее подготовленную дату не получится, только внутри выражения по-новой писать
 

Фанат

oncle terrible
Команда форума
офигеть какая умная идея
"если я сейчас подтяжки отпущу - как они Василь Иваныча по спине хлопнут!"
 

Фанат

oncle terrible
Команда форума
синтаксис SQL надо учить, вот чо
в кавычках в SQL пишется что?
 

novi4ok

Новичок
У меня нормально выводит даты только вот этот запрос:
PHP:
SELECT DATE_FORMAT(hd_date, '2013-%m-%d') AS `data`
     , date_add(DATE_FORMAT(hd_date, '2013-%m-%d'), INTERVAL - hd_datein DAY) AS `datein`
     , DATE_FORMAT(date_add(hd_date, INTERVAL + hd_dateout DAY), '2013-%m-%d') AS `dateout`
FROM
  bd_name
И то без сравнения и не меняет год в первой строке.
 

Фанат

oncle terrible
Команда форума
ну вот а теперь всю эту колбасу - во where :)

Кстати, в мускуле есть to_days(). возможно, поможет сильно сократить код
 

novi4ok

Новичок
Что то не так. Ошибку не даёт и не выводит ничего. Если data без кавычек, то ругается на неизвестный идентификатор.
PHP:
SELECT DATE_FORMAT(hd_date, '2013-%m-%d') AS `data`
     , date_add(DATE_FORMAT(hd_date, '2013-%m-%d'), INTERVAL -hd_datein DAY) AS datein
     , DATE_FORMAT(date_add(hd_date, INTERVAL +hd_dateout DAY), '2013-%m-%d') AS dateout
FROM
  bd_name
WHERE
  to_days(now()) - to_days('data') >= hd_datein
  AND to_days(now()) - to_days('data') <= hd_dateout
 

Фанат

oncle terrible
Команда форума
всю эту колбасу - во where
не продукт её переработки, а её саму
 

Фанат

oncle terrible
Команда форума
PHP:
to_days(now()) - to_days('data') >= hd_datein
если прорсто для сравнения, то переводить в дни смысла нет. ты только добавляешь по функции с каждой стороны.
тебе любой совет только во вред идёт. в общем, забудь про to_days.
 

Фанат

oncle terrible
Команда форума
и прочти уже где-нибудь, что означают кавычки в SQL запросе
 
Сверху