Фильтр по дате

Ответить
asyab
Сообщения: 75
Зарегистрирован: 30 июн 2015, 14:55
Имя: Анастасия

Фильтр по дате

Сообщение asyab »

Добрый день! В сущности есть поле дата рождения тип дата с календарем. Если ставить фильтр дата рождения до 31.12.1969 от любой даты меньше , то к выдаче ничего нет, хотя на самом деле очень много записей. Причем столкнулась с этим в двух разных системах и на разных серверах. Фильтры по дате рождения начиная с 1970г и выше работают вроде нормально.
В одной из систем в поле возраст стоит формула определения возраста по дате рождения
if([203]>'01/01/1917' and [TODAY]>[203],([TODAY]-[203])/31536000,'дата рожд. не корректна')
где 203- id дата рождения
Если дата рождения 1960 г и ниже, то в поле возраст пишет 'дата рожд. не корректна' - хотя это не верно.
Если ставлю фильтр про который писала выше, то не показывает записи, где дата рождения =<1960г, хотя они есть
Если дата рождения >=1970г- то и формула и фильтр отрабатывают корректно.
Помогите, пожалуйста, разобраться
Аватара пользователя
support
Техническая поддержка
Сообщения: 8993
Зарегистрирован: 19 окт 2014, 18:22
Имя: Харчишин Сергей
Откуда: Крым, Евпатория

Re: Фильтр по дате

Сообщение support »

К сожалению это исправить не возможно:(
При разработке кода я все даты сохраняю в секундах, так удобнее проводить операции с датами.
Но в таком варианте даты работают от 1 января 1970 00:00:00 GMT
http://us1.php.net/manual/ru/function.time.php
Я подумаю над этой проблемой, возможно создам дополнительный тип поля "Дата рождения"
Аватара пользователя
support
Техническая поддержка
Сообщения: 8993
Зарегистрирован: 19 окт 2014, 18:22
Имя: Харчишин Сергей
Откуда: Крым, Евпатория

Re: Фильтр по дате

Сообщение support »

Решение найдено. Вводить дополнительное поле не потребуется. Исправление будет в 1.9.

Чтобы исправить фильтры сейчас, откройте фал includes\classes\reports\reports.php
и найдите строчки 410-418

Код: Выделить всё

if(strlen($values[1])>0)
{
	$sql[] = "FROM_UNIXTIME(" . $field_name . ",'%Y-%m-%d')>='" . db_input($values[1])  . "'";
}
	          
if(strlen($values[2])>0)
{
	$sql[] = "FROM_UNIXTIME(" . $field_name . ",'%Y-%m-%d')<='" . db_input($values[2])  . "'";
}
Замените их на следующих код:

Код: Выделить всё

if(strlen($values[1])>0)
{
	if(strtotime($values[1])<0)
	{
		$sql[] = "DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0),INTERVAL " . $field_name . " SECOND),'%Y-%m-%d')>='" . db_input($values[1])  . "'";
	}
	else
        {	
		$sql[] = "FROM_UNIXTIME(" . $field_name . ",'%Y-%m-%d')>='" . db_input($values[1])  . "'";
	}
	            
 }
	          
if(strlen($values[2])>0)
{
	if(strtotime($values[2])<0)
	{
		$sql[] = "DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0),INTERVAL " . $field_name . " SECOND),'%Y-%m-%d')<='" . db_input($values[2])  . "'";
	}
	else
	{
		$sql[] = "FROM_UNIXTIME(" . $field_name . ",'%Y-%m-%d')<='" . db_input($values[2])  . "'";
	}
}
И фильтры должны заработать коректно с датой ниже 1970

Для того, чтобы подсчитать возраст, вам следует использовать mysql функцию "year". Пример формулы для расчета возраста:

Код: Выделить всё

year(now())- year(DATE_FORMAT(DATE_ADD(FROM_UNIXTIME(0),INTERVAL [203] SECOND),'%Y-%m-%d'))
где [203] - дата рождения
asyab
Сообщения: 75
Зарегистрирован: 30 июн 2015, 14:55
Имя: Анастасия

Re: Фильтр по дате

Сообщение asyab »

Спасибо большое, теперь заработало.
asyab
Сообщения: 75
Зарегистрирован: 30 июн 2015, 14:55
Имя: Анастасия

Re: Фильтр по дате

Сообщение asyab »

И за формулу спасибо отдельно
Ответить