XOR functionality for meta_query

Okay!
So, having spent all the night in order to find a right solution… finally.. I did it.
Here is the right method, that works in my situation.

The $wpbd method is pretty cool and complicated at the same time.
While using this method do not forget to cache queries properly with php-apc or memcache.

While doing some testings realized, that XOR logic operation does not work properly. So, I replaced XOR by a set: XOR = ( ( A AND NOT B ) OR ( NOT A AND B ) ). This one works!

//Week events
$query_date = $_GET['date'];
$month_start = date('Ym01',strtotime('this month'));
$month_end = date('Ymt',strtotime('this month'));
$pm1_meta_key = 'event_start_date';
$pm2_meta_key = 'event_end_date';

//IF query Day is empty
if ( empty($query_date) ) {

  //Custom query
  $postids = $wpdb->get_col( $wpdb->prepare(
    "
    SELECT p.* FROM $wpdb->posts p
    JOIN $wpdb->postmeta pm1 ON (p.ID = pm1.post_id)
    JOIN $wpdb->postmeta pm2 ON (p.ID = pm2.post_id)
    WHERE p.post_type="post"
      AND p.post_status="publish"
      AND ( ( pm1.meta_key ='%1\$s' 
      AND CAST( pm1.meta_value AS DATE) BETWEEN %3\$d AND %4\$d )
      OR ( pm2.meta_key = '%2\$s' 
      AND CAST( pm2.meta_value AS DATE ) BETWEEN %3\$d AND %4\$d ) )
    ",
   $pm1_meta_key,
   $pm2_meta_key,
   $month_start,
   $month_end
  ));

  $args = array(
    'post__in' => $postids,
    'meta_key' => 'event_start_date',
    'orderby' => 'meta_value_num',
    'order' => 'ASC'
  );

} else {

  //Date
  $query_date = date('Ymd', strtotime($query_date));
  $query_date_month = date('m', strtotime($query_date));

  //If future month
  if ( $query_date_month > date('m') ) {
    $month_end = date('Ymt', mktime(0, 0, 0, $query_date_month, 1, date('y')));
  }

  //Custom query
  $postids = $wpdb->get_col( $wpdb->prepare(
    "
    SELECT p.* FROM $wpdb->posts p
    JOIN $wpdb->postmeta pm1 ON (p.ID = pm1.post_id)
    JOIN $wpdb->postmeta pm2 ON (p.ID = pm2.post_id)
    WHERE p.post_type="post"
      AND p.post_status="publish"
      AND ( ( ( pm1.meta_key = '%1\$s' 
      AND CAST( pm1.meta_value AS DATE) BETWEEN %3\$d AND %4\$d )
      AND ( pm2.meta_key = '%2\$s' 
      AND CAST( pm2.meta_value AS DATE ) NOT BETWEEN %3\$d AND %4\$d ) )
      OR ( ( pm1.meta_key = '%1\$s' 
      AND CAST( pm1.meta_value AS DATE) NOT BETWEEN %3\$d AND %4\$d )
      AND ( pm2.meta_key = '%2\$s' 
      AND CAST( pm2.meta_value AS DATE ) BETWEEN %3\$d AND %4\$d ) ) )
      OR ( pm1.meta_key = '%1\$s' 
      AND CAST( pm1.meta_value AS DATE) = %3\$d )
    ",
   $pm1_meta_key,
   $pm2_meta_key,
   $query_date,
   $month_end
  ) );

  $args = array(
    'post__in' => $postids,
    'meta_key' => 'event_start_date',
    'orderby' => 'meta_value_num',
    'order' => 'ASC'
  );

}

$wp_query = new WP_Query( $args );
//End of custom query