Index: trunk/ippTools/src/dettool.c
===================================================================
--- trunk/ippTools/src/dettool.c	(revision 9947)
+++ trunk/ippTools/src/dettool.c	(revision 9957)
@@ -968,7 +968,51 @@
     }
 
+    // create a metadata to restrict detInputExp's be in in the specified range
+
+    psMetadata *time_filter = psMetadataAlloc();
+
+    {
+        psString timeStr = psMetadataLookupStr(&status, config->args, "-filter_exp_begin");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter_exp_begin");
+            return false;
+        }
+        // pass through NULL as this is an optional field
+        if (timeStr) {
+            psTime *time = psTimeFromISO(timeStr, PS_TIME_UTC);
+            if (!psMetadataAddTime(time_filter, PS_LIST_TAIL, "dateobs", 0, "==", time)) {
+                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
+                psFree(time);
+                psFree(time_filter);
+                return false;
+            }
+            psFree(time);
+        }
+    }
+
+    {
+        psString timeStr = psMetadataLookupStr(&status, config->args, "-filter_exp_end");
+        if (!status) {
+            psError(PS_ERR_UNKNOWN, false, "failed to lookup value for -filter_exp_end");
+            return false;
+        }
+        // pass through NULL as this is an optional field
+        if (timeStr) {
+            psTime *time = psTimeFromISO(timeStr, PS_TIME_UTC);
+            if (!psMetadataAddTime(time_filter, PS_LIST_TAIL, "dateobs", 0, "==", time)) {
+                psError(PS_ERR_UNKNOWN, false, "failed to add item dateobs");
+                psFree(time);
+                psFree(time_filter);
+                return false;
+            }
+            psFree(time);
+        }
+    }
+
+
     // start a transaction so we don't end up with orphaned det_ids
     if (!psDBTransaction(config->dbh)) {
         psError(PS_ERR_UNKNOWN, false, "database error");
+        psFree(time_filter);
         psFree(detRun);
         return false;
@@ -981,4 +1025,5 @@
             psError(PS_ERR_UNKNOWN, false, "database error");
         }
+        psFree(time_filter);
         psFree(detRun);
         return false;
@@ -989,5 +1034,5 @@
     long newDet_id = psDBLastInsertID(config->dbh);
 
-    char *query = 
+    psString query = psStringCopy(
         "INSERT INTO detInputExp"
         "   SELECT"
@@ -997,10 +1042,22 @@
         "       detResidExp.accept"
         "   FROM detResidExp"
-        "   WHERE det_id = %d";
+        "   JOIN rawDetrendExp"
+        "       USING(exp_tag)"
+        "   WHERE det_id = %d"
+    );
+
+    if (time_filter->list->n) {
+        psString whereClause = psDBGenerateWhereConditionSQL(time_filter, "rawDetrendExp");
+        psStringAppend(&query, " AND %s", whereClause);
+        psFree(whereClause);
+    }
+    psFree(time_filter);
 
     if (!p_psDBRunQuery(config->dbh, query, (psS32)newDet_id, (psS32)atoi(det_id))) {
         psError(PS_ERR_UNKNOWN, false, "database error");
-        return false;
-    }
+        psFree(query);
+        return false;
+    }
+    psFree(query);
 
     // point of no return for det_id creation
