Страница 1 из 1

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

Добавлено: 12 апр 2017, 16:08
asyab
Добрый день! В сущности есть поле дата рождения тип дата с календарем. Если ставить фильтр дата рождения до 31.12.1969 от любой даты меньше , то к выдаче ничего нет, хотя на самом деле очень много записей. Причем столкнулась с этим в двух разных системах и на разных серверах. Фильтры по дате рождения начиная с 1970г и выше работают вроде нормально.
В одной из систем в поле возраст стоит формула определения возраста по дате рождения
if([203]>'01/01/1917' and [TODAY]>[203],([TODAY]-[203])/31536000,'дата рожд. не корректна')
где 203- id дата рождения
Если дата рождения 1960 г и ниже, то в поле возраст пишет 'дата рожд. не корректна' - хотя это не верно.
Если ставлю фильтр про который писала выше, то не показывает записи, где дата рождения =<1960г, хотя они есть
Если дата рождения >=1970г- то и формула и фильтр отрабатывают корректно.
Помогите, пожалуйста, разобраться

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

Добавлено: 12 апр 2017, 18:09
support
К сожалению это исправить не возможно:(
При разработке кода я все даты сохраняю в секундах, так удобнее проводить операции с датами.
Но в таком варианте даты работают от 1 января 1970 00:00:00 GMT
http://us1.php.net/manual/ru/function.time.php
Я подумаю над этой проблемой, возможно создам дополнительный тип поля "Дата рождения"

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

Добавлено: 15 май 2017, 13:17
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] - дата рождения

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

Добавлено: 15 май 2017, 13:52
asyab
Спасибо большое, теперь заработало.

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

Добавлено: 15 май 2017, 17:47
asyab
И за формулу спасибо отдельно