Index: date_api_sql.inc
===================================================================
RCS file: /cvs/drupal-contrib/contributions/modules/date/date_api_sql.inc,v
retrieving revision 1.9.2.3.2.37
diff -u -p -r1.9.2.3.2.37 date_api_sql.inc
--- date_api_sql.inc	16 Sep 2009 11:13:01 -0000	1.9.2.3.2.37
+++ date_api_sql.inc	1 Dec 2009 21:26:54 -0000
@@ -749,7 +749,7 @@ class date_sql_handler {
         if (!empty($matches[7])) $date['second'] = $matches[7];
         $parts['date'] = $date;
       }
-      if (preg_match('/^P(\d{1,4}[Y])?(\d{1,2}[M])?(\d{1,2}[W])?(\d{1,2}[D])?([T]{0,1})?(\d{1,2}[H])?(\d{1,2}[M])?(\d{1,2}[S])?/', $arg, $matches)) {
+      if (preg_match('/^P(-?\d{1,4}[Y])?(-?\d{1,2}[M])?(-?\d{1,2}[W])?(-?\d{1,2}[D])?([T]{0,1})?(-?\d{1,2}[H])?(-?\d{1,2}[M])?(-?\d{1,2}[S])?/', $arg, $matches)) {
         $period = array();
         if (!empty($matches[1])) $period['year'] =  str_replace('Y', '', $matches[1]);
         if (!empty($matches[2])) $period['month'] = str_replace('M', '', $matches[2]);
@@ -862,8 +862,13 @@ class date_sql_handler {
           $max_date = drupal_clone($min_date);
           date_modify($max_date, "+$value $part");
         }
-        date_modify($max_date, '-1 second');
-        return array($min_date, $max_date);
+        if (date_convert($max_date, DATE_OBJECT, DATE_UNIX) < date_convert($min_date, DATE_OBJECT, DATE_UNIX)) {
+          return array($max_date, $min_date);
+        }
+        else {
+          date_modify($max_date, '-1 second');
+          return array($min_date, $max_date);
+        }
       }
     }
     // Build a range from start date and end date.
