查询未收集所有数据

时间:2012-04-27 18:24:16

标签: sql time

我创建了一个用于显示查询数据的屏幕。该查询应该从过程中收集每日生产的材料。查询如下:

Select SUM(ltv.val) "CE" FROM LADLE_TAP_VALUE ltv, LADLE_TAP_ID lti where ltv.id=108 AND ltv.ladletapid =lti.ladletapid and lti.tapid IN (Select ti.TapID FROM tap_index ti WHERE ti.tapno like 'CE%' AND ti.starttime>=to_date('20120426', 'yyyymmdd hh24:mi:ss') and ti.endtime<=to_date('20120427 00:00:00', 'yyyymmdd hh24:mi:ss'));

我面临的问题是,偶尔会有一天的开始时间接近结束,而结束时间则是第二天的第一个小时。 我不知道如何使用查询的时间处理部分进行调整。这是一个问题,因为每天我都会错过我的显示器中的产品。

tap_index table
tapid tapno plant taphole drytap status startime endtime slagstart readytime 
21437   CN121348    1   1   1   0   26-APR-12 06:00:26  26-APR-12 07:42:41  26-APR-12 06:56:34  26-APR-12 06:00:00
21436   CE121347    1   2   1   0   26-APR-12 03:21:10  26-APR-12 05:40:48  26-APR-12 04:39:27  26-APR-12 03:21:00
21435   CN121346    1   1   1   0   26-APR-12 01:48:07  26-APR-12 03:01:23  26-APR-12 02:27:34  26-APR-12 01:48:00
21434   CE121345    1   2   1   0   25-APR-12 23:27:23  26-APR-12 01:28:08  26-APR-12 00:44:09  25-APR-12 23:27:00
21433   CN121344    1   1   1   0   25-APR-12 21:18:24  25-APR-12 23:07:17  25-APR-12 22:31:04  25-APR-12 21:18:00
21432   CE121343    1   2   1   0   25-APR-12 19:55:08  25-APR-12 20:58:59  25-APR-12 20:22:39  25-APR-12 19:55:00
21431   CN121342    1   1   1   0   25-APR-12 18:09:28  25-21422    CE121333    1   2   1   0   24-APR-12 22:56:17  25-APR-12 00:29:23  24-APR-12 23:32:27  24-APR-12 22:56:00

21421 CN121332 1 1 1 0 24-APR-12 20:49:25 24-APR-12 22:36:37 24-APR-12 21:59:30 24-APR-12 20:49:00 21420 CE121331 1 2 1 0 24-APR-12 18:15:12 24-APR-12 20:30:16 24-APR-12 19:19:42 24-APR-12 18:15:00 21419 CN121330 1 1 1 0 24-APR-12 16:06:06 24-APR-12 17:55:12 24-APR-12 17:02:33 24-APR-12 16:06:00 21418 CE121329 1 2 1 0 24-APR-12 14:04:36 24-APR-12 15:44:40 24-APR-12 14:50:33 24-APR-12 14:04:00

2 个答案:

答案 0 :(得分:3)

您似乎正在尝试提取给定日期的所有记录。通常,最好的方法是使用以下逻辑构造查询:

  • DateField&lt; trunc(:EndDate)+ 1:获取EndDate后一天的所有记录
  • DateField&gt; = trunc(:StartDate):获取StartDate开头或之后的所有记录

我提到“trunc”,因为像这样的查询的参数化输入通常包括时间部分。 trunc从日期中删除时间部分。

在您的示例中,我认为查询可以如下所示 - 我只是将“ti.endtime”更改为使用“&lt;”而不是“&lt; =”,这样你就不会从4月27日开始获得记录。

Select SUM(ltv.val) "CE" 
  FROM LADLE_TAP_VALUE ltv, LADLE_TAP_ID lti 
 where ltv.id=108 
   AND ltv.ladletapid =lti.ladletapid 
   and lti.tapid IN (Select ti.TapID 
                       FROM tap_index ti 
                      WHERE ti.tapno like 'CE%' AND ti.starttime>=to_date('20120426', 'yyyymmdd hh24:mi:ss') and ti.endtime < to_date('20120427 00:00:00', 'yyyymmdd hh24:mi:ss'));

答案 1 :(得分:0)

ti.starttime >= $start and ti.endtime <= $end选择完全适合[$ start .. $ end]内的所有跨度。

ti.endtime >= $start and ti.starttime <= $end将以某种方式选择与[$ start .. $ end]相交的所有跨距。