diff --git a/includes/views/commerce_reports_handler_field_date.inc b/includes/views/commerce_reports_handler_field_date.inc
index 1febbda..f8a81f7 100644
--- a/includes/views/commerce_reports_handler_field_date.inc
+++ b/includes/views/commerce_reports_handler_field_date.inc
@@ -27,7 +27,7 @@ class commerce_reports_handler_field_date extends views_handler_field {
   );
 
   protected function _normalizeWeekly($timestamp) {
-    return strtotime('this week UTC', $timestamp);
+    return strtotime('Mon this week', $timestamp);
   }
 
   protected function _normalizeMonthly($timestamp) {
@@ -220,12 +220,33 @@ class commerce_reports_handler_field_date extends views_handler_field {
     $field_name = views_date_sql_format($this->getFormat(), $this->table_alias . '.' . $this->real_field);
     $this->query->add_groupby($field_name);
 
-    $end_date = $this->endDate + $this->getInterval();
+    $end_date = $this->getQueryEndDate($this->endDate);
     $this->query->add_where_expression(0, "{$this->table_alias}.{$this->real_field} BETWEEN {$this->startDate} AND {$end_date}");
 
     $this->add_additional_fields();
   }
 
+  /**
+   * @param $timestamp
+   *  The normalized end date as a Unix timestamp.
+   *
+   * @return int
+   *  The appropriate end date for a query, based on the input granularity.
+   */
+  function getQueryEndDate($timestamp) {
+    switch ($this->getFormat()) {
+      case 'Y-m':
+        // It's monthly
+        return strtotime(date('M-t-Y', $timestamp) . '+1 day');
+      case 'o-W':
+        // It's weekly
+        return strtotime(date('M-d-Y', $timestamp) . '+1 week');
+      case 'Y-m-d':
+        // It's daily
+        return strtotime(date('M-d-Y', $timestamp) . '+1 day');
+    }
+  }
+
   function render($values) {
     $timestamp = $this->get_value($values);
 
