0

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

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

4

2 回答 2

3

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

  • DateField < trunc(:EndDate) + 1:获取 EndDate 后一天之前的所有记录
  • DateField >= trunc(:StartDate): 在 StartDate 开始时或之后获取所有记录

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

在您的示例中,我想查询可以如下所示 - 我只是将“ti.endtime”更改为使用“<”而不是“<=”,这样您就不会从 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'));
于 2012-04-27T18:32:28.083 回答
0

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

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

于 2012-04-27T18:40:18.907 回答