diff --git a/include/QueryGenerator/QueryGenerator.php b/include/QueryGenerator/QueryGenerator.php
index 8844692dd9cc25e0ce0e222757b4ede1ec1596f6..b5bbd0f9d424fe8ba590a955b19ede523999f148 100644
--- a/include/QueryGenerator/QueryGenerator.php
+++ b/include/QueryGenerator/QueryGenerator.php
@@ -1029,30 +1029,55 @@ class QueryGenerator {
 			if(!$this->isStringType($field->getFieldDataType())) {
 				$value = trim($value);
 			}
-			if ($operator == 'empty' || $operator == 'y') {
-				$sql[] = sprintf("IS NULL OR %s = ''", $this->getSQLColumn($field->getFieldName(), $field));
-				continue;
-			}
-			if($operator == 'ny'){
-				$sql[] = sprintf("IS NOT NULL AND %s != ''", $this->getSQLColumn($field->getFieldName(), $field));
-				continue;
-			}
-			if ($operator == 'k') {
+			// If value is empty and comparator is equals then we have to check IS NULL (same as "is empty" condition)
+                        if ($operator == 'empty' || $operator == 'y') {
+                            $sqlFieldDataType = $field->getFieldDataType();
+                            if($sqlFieldDataType == 'date' || $sqlFieldDataType == 'birthday'){
+                                    $sqlFormat = sprintf("IS NULL OR %s = '0000-00-00'", $this->getSQLColumn($field->getFieldName(), $field));
+                            } else if($sqlFieldDataType == 'datetime'){
+                                    $sqlFormat = sprintf("IS NULL OR %s = '0000-00-00 00:00:00'", $this->getSQLColumn($field->getFieldName(), $field));
+                            } else {
+                                    $sqlFormat = sprintf("IS NULL OR %s = ''", $this->getSQLColumn($field->getFieldName(), $field));
+                            }
+                            $sql[] = $sqlFormat;
+                            continue;
+                        }
+			if ($operator == 'ny') {
+                            $sqlFieldDataType = $field->getFieldDataType();
+                            if ($sqlFieldDataType == 'date' || $sqlFieldDataType == 'birthday') {
+                                $sqlFormat = sprintf("IS NOT NULL AND %s != '0000-00-00'", $this->getSQLColumn($field->getFieldName(), $field));
+                            } else if ($sqlFieldDataType == 'datetime') {
+                                $sqlFormat = sprintf("IS NOT NULL AND %s != '0000-00-00 00:00:00'", $this->getSQLColumn($field->getFieldName(), $field));
+                            } else {
+                                $sqlFormat = sprintf("IS NOT NULL AND %s != ''", $this->getSQLColumn($field->getFieldName(), $field));
+                            }
+                            $sql[] = $sqlFormat;
+                            continue;
+                        }
+                        if ($operator == 'k') {
 				$sql[] = sprintf("IS NULL OR %s NOT LIKE '%%%s%%'", $this->getSQLColumn($field->getFieldName(), $field), $value);
 				continue;
 			}
-			if((strtolower(trim($value)) == 'null') ||
-					(trim($value) == '' && !$this->isStringType($field->getFieldDataType())) &&
-							($operator == 'e' || $operator == 'n')) {
-				if($operator == 'e'){
-					$sql[] = "IS NULL";
-					$sql[] = "= ''";
-					continue;
-				} else {
-					$sql[] = "IS NOT NULL";
-					$sql[] = "!= ''";
-					continue;
-				}
+			$trimmedValue = is_array($value) ? NULL : trim($value);
+                        if((strtolower($trimmedValue) == 'null') ||
+                                ($trimmedValue == '' && !$this->isStringType($field->getFieldDataType())) &&
+                                ($operator == 'e' || $operator == 'n')) {
+                            if($operator == 'e'){
+                                $sql[] = "IS NULL";
+                                $sqlFieldDataType = $field->getFieldDataType();
+                                if($sqlFieldDataType == 'date' || $sqlFieldDataType == 'birthday'){
+                                        $sql[] = "= '0000-00-00'";
+                                } else if($sqlFieldDataType == 'datetime'){
+                                        $sql[] = "= '0000-00-00 00:00:00'";
+                                } else {
+                                        $sql[] = "= ''";
+                                }
+                                continue;
+                            } else {
+                                $sql[] = "IS NOT NULL";
+                                $sql[] = "!= ''";
+                                continue;
+                            }
 			} elseif($field->getFieldDataType() == 'boolean') {
 				$value = strtolower($value);
 				if ($value == 'yes') {
@@ -1096,11 +1121,11 @@ class QueryGenerator {
 			}
 
 			if($field->getFieldName() == 'birthday' && !$this->isRelativeSearchOperators(
-					$operator)) {
-				$value = "DATE_FORMAT(".$db->quote($value).", '%m%d')";
-			} else {
-				$value = $db->sql_escape_string($value);
-			}
+                                $operator)) {
+                            $value = "DATE_FORMAT(".$db->quote($value).", '%m%d')";
+                        } else {
+                            $value = is_array($value) ? NULL : $db->sql_escape_string($value);
+                        }
 
 			if(trim($value) == '' && ($operator == 's' || $operator == 'ew' || $operator == 'c')
 					&& ($this->isStringType($field->getFieldDataType()) ||
@@ -1150,14 +1175,32 @@ class QueryGenerator {
 				$sql[] = "IS NULL";
 			}
 
-			if( ($field->getFieldName() != 'birthday' || ($field->getFieldName() == 'birthday'
-							&& $this->isRelativeSearchOperators($operator)))){
-				$value = "'$value'";
-			}
-
-			if(($this->isNumericType($field->getFieldDataType())) && empty($value)) {				
-				$value = '0';
-			}
+                        /**
+                         * While searching in decimal type columns, then value will be stored like 100.1234 (as float value).
+                         * When user search for 100 then also it should show up 100.1234 for which we are altering comparator and 
+                         * value here. If we search 'equal' or 'not equal' we will change to 'like' or 'not like'
+                         * NOTE : Same thing handled in ReportRun->generateAdvFilterSql() api
+                         */
+                        if($this->isFloatType($field->getFieldDataType()) && !empty($value)
+                                && in_array($operator, array('e', 'n') )){
+                            $sqlOperator = ($operator == 'e') ? ' LIKE ' : ' NOT LIKE ';
+                                if ((float) $value == round((float)$value)) {
+                                // if given value is witn out any decimals (Ex:- 1234), then we search with '1234.%'
+                                $value = $value.'.';
+                            }
+                            $value = $value."%";
+                        }
+
+                        if( ($field->getFieldDataType() != 'birthday' || ($field->getFieldDataType() == 'birthday'
+                                        && $this->isRelativeSearchOperators($operator)))){
+                            if($field->getFieldDataType() !== 'integer'){
+                                $value = "'$value'";
+                            }
+                        }
+
+                        if($this->isNumericType($field->getFieldDataType()) && empty($value)) {
+                            $value = '0';
+                        }
 			$sql[] = "$sqlOperator $value";
 		}
 		return $sql;
@@ -1185,6 +1228,14 @@ class QueryGenerator {
 	protected function isNumericType($type) {
 		return ($type == 'integer' || $type == 'double' || $type == 'currency');
 	}
+        
+        /**
+        * Function to identify given type is a floating(decimal) type or not. Column types like decimal will store 
+        * information as floating values. All those column related field types comes under this
+        */
+        protected function isFloatType($type) {
+           return ($type == 'double' || $type == 'currency' || $type == 'multicurrency');
+        }
 
 	protected function isStringType($type) {
 		return ($type == 'string' || $type == 'text' || $type == 'email' || $type == 'reference');
diff --git a/modules/Reports/models/Chart.php b/modules/Reports/models/Chart.php
index 10fbb99877103ad0386ddbae6bd55e026d358535..62ae4124b65e2221dce81f92b5c87451ef53c48f 100644
--- a/modules/Reports/models/Chart.php
+++ b/modules/Reports/models/Chart.php
@@ -359,33 +359,61 @@ abstract class Base_Chart extends Vtiger_Base_Model{
 
 		$filter = $reportRunObject->getAdvFilterList($reportModel->getId(), true);
 
-		// Special handling for date fields
-		$comparator = 'e';
-		$dataFieldInfo = @explode(':', $field);
-		if(($dataFieldInfo[4] == 'D' || $dataFieldInfo[4] == 'DT') && !empty($dataFieldInfo[5])) {
-			$dataValue = explode(' ',$value);
-			if(php7_count($dataValue) > 1) {
-				$comparator = 'bw';
-				if($dataFieldInfo[4] == 'D') {
-					$value = date('Y-m-d', strtotime($value)).','.date('Y-m-d', strtotime('last day of'.$value));
-				} else {
-					$value = date('Y-m-d H:i:s' ,strtotime($value)).','.date('Y-m-d' ,strtotime('last day of'.$value)).' 23:59:59';
-				}
-			} else {
-				$comparator = 'bw';
-				if($dataFieldInfo[4] == 'D') {
-					$value = date('Y-m-d', strtotime('first day of JANUARY '.$value)).','.date('Y-m-d', strtotime('last day of DECEMBER '.$value));
-				} else {
-					$value = date('Y-m-d H:i:s' ,strtotime('first day of JANUARY '.$value)).','.date('Y-m-d' ,strtotime('last day of DECEMBER '.$value)).' 23:59:59';
-				}
-			}
-		} elseif($dataFieldInfo[4] == 'DT') {
-			$value = Vtiger_Date_UIType::getDisplayDateTimeValue($value);
-		}
-
-		if(empty($value)) {
-			$comparator = 'empty';
-		}
+                // Special handling for date fields
+                $comparator = 'e';
+                $dataFieldInfo = @explode(':', $field);
+                if (($dataFieldInfo[4] == 'D' || $dataFieldInfo[4] == 'DT') && !empty($dataFieldInfo[5]) && !empty($value)) {
+                    $dataValue = explode(' ', $value);
+                    if ($dataFieldInfo[5] == 'WY') {//click through handling for group by week.
+                        $comparator = 'bw';
+                        $dateRange = getWeekDateRange($value);
+                        if ($dataFieldInfo[4] == 'D') {
+                            $value = $dateRange[0] . ',' . $dateRange[1];
+                        } else {
+                            $value = $dateRange[0] . ' 00:00:00' . ',' . $dateRange[1] . ' 23:59:59';
+                        }
+                    } else if ($dataFieldInfo[5] == 'DD') { // click through handling for group by day
+                        $comparator = 'bw';
+                        $value = date('Y-m-d H:i:s', strtotime($value)) . ',' . date('Y-m-d', strtotime($value)) . ' 23:59:59';
+                    } else if (php7_count($dataValue) > 1) {
+                        $comparator = 'bw';
+                        if ($dataFieldInfo[4] == 'D') {
+                            $value = date('Y-m-d', strtotime($value)) . ',' . date('Y-m-d', strtotime('last day of' . $value));
+                        } else {
+                            $value = date('Y-m-d H:i:s', strtotime($value)) . ',' . date('Y-m-d', strtotime('last day of' . $value)) . ' 23:59:59';
+                        }
+                    } else {
+                        $comparator = 'bw';
+                        if ($dataFieldInfo[4] == 'D') {
+                            $value = date('Y-m-d', strtotime('first day of JANUARY ' . $value)) . ',' . date('Y-m-d', strtotime('last day of DECEMBER ' . $value));
+                        } else {
+                            $value = date('Y-m-d H:i:s', strtotime('first day of JANUARY ' . $value)) . ',' . date('Y-m-d', strtotime('last day of DECEMBER ' . $value)) . ' 23:59:59';
+                        }
+                    }
+
+                    //Converting value to user format.
+                    $valueParts = explode(',', $value);
+                    foreach ($valueParts as $key => $valuePart) {
+                        if ($dataFieldInfo[4] == 'DT') {
+                            $value = explode(' ', trim($valuePart));
+                            $date = new DateTimeField($value[0]);
+                            $valueParts[$key] = $date->getDisplayDate();
+                        } else {
+                            $valueParts[$key] = Vtiger_Date_UIType::getDisplayDateValue(trim($valuePart));
+                        }
+                    }
+                    $value = implode(',', $valueParts);
+                } elseif ($dataFieldInfo[4] == 'DT') {
+                    if (!empty($value) && $value != '0000-00-00 00:00:00') {
+                        $value = Vtiger_Date_UIType::getDisplayDateTimeValue($value);
+                    }
+                    $value .= "," . $value;
+                } elseif ($dataFieldInfo[4] == 'D' && empty($dataFieldInfo[5]) && !empty($value)) {
+                    $value = Vtiger_Date_UIType::getDisplayDateValue($value);
+                }
+                if (empty($value)) {
+                    $comparator = 'empty';
+                }
 
 		$advancedFilterConditions = $reportModel->transformToNewAdvancedFilter();
 		//Step 1. Add the filter condition for the field
@@ -797,4 +825,4 @@ class HorizontalbarChart extends VerticalbarChart {
 
 class LineChart extends VerticalbarChart{
 
-}
\ No newline at end of file
+}