1

我不太确定如何措辞标题,对此感到抱歉。我正在尝试将一些开始和停止计划时间加载到数据库中,但有时同一系统的开始和停止时间会重叠,例如一个时间可能是5:30 to 12:30,然后同一系统的另一个时间可能是8:30 to 10:30我想避免插入该数据到表中。

我在 java 程序中使用 jdbc 和 odbc 桥来完成这一切,当用户单击生成计划时,它会从文本文件中读取所有计划信息,然后将其插入数据库。当程序读取已经存在的时间之间的时间时,我想跳过插入。

我的想法必须是一些如何比较我从文本文件中获得的结束时间与数据库中时间的 MAX 值,如果它小于该值,则跳过此插入,但我不知道如何绑定 MAX 值进入 if 语句。另一个想法是在我完成所有插入之后,只需删除SCHEDULE_TIME大于列中最小值SCHEDULE_TIMESCHEDULE_TIME小于列中最大值的SCHEDULE_TIME行。

这是我表中数据的示例:

SITE_ID ------- DEV_ID ------- SCHEDULE_TIME ------- VALUE_ENUM
---------------------------------------------------------------
1               3000           09:30:00              1
1               3000           15:30:00              0
1               3000           12:30:00              1
1               3000           13:30:00              0
1               3000           16:30:00              1
1               3000           18:30:00              0

行从开始时间到停止时间交替,所有VALUE_ENUM为 1 的行是开始时间,所有VALUE_ENUM为 0 的行是停止时间。我试图删除其他开始和停止时间之间的时间,在这种情况下删除第 3 行和第 4 行。请记住,这个表实际上从文本文件中创建了数百行,所以我不能手动删除它,它会是最好是我能找到一种方法来避免插入它。

这是我当前插入方法的副本,忽略我使用的所有额外列,它们与问题无关,它们只是使用,所以我为正确的系统添加和删除。

private void Insert() throws SQLException
{
    stmt = conn.createStatement();  

    String sqlStm = "update ARRAY_BAC_SCH_Schedule set SCHEDULE_TIME = {t '" + finalEnd + "'} WHERE SCHEDULE_TIME >=  {t '" + finalStart + "'} AND" +
        " SCHEDULE_TIME <=  {t '" + finalEnd + "'} AND VALUE_ENUM = 0 AND DEV_ID = " + devID + " and INSTANCE = " + instanceNum;
    int updateSuccess = stmt.executeUpdate(sqlStm);

    if (updateSuccess < 1)
    {

        sqlStm = "insert into ARRAY_BAC_SCH_Schedule (SITE_ID, DEV_ID, INSTANCE, DAY, SCHEDULE_TIME, VALUE_ENUM, Value_Type) " +
                " values (1, " + devID + ", " + instanceNum + ", " + day + ", {t '" + finalStart + "'}, 1, 'Unsupported')";
        stmt.executeUpdate(sqlStm);
        sqlStm = "insert into ARRAY_BAC_SCH_Schedule (SITE_ID, DEV_ID, INSTANCE, DAY, SCHEDULE_TIME, VALUE_ENUM, Value_Type) " +
                " values (1," + devID + ", " + instanceNum + ", " + day + ", {t '" + finalEnd + "'}, 0, 'Unsupported')";
        stmt.executeUpdate(sqlStm);
    }


    if(stmt!=null)
        stmt.close();
}

我希望我已经对此进行了足够的解释,如果问题不清楚,我很抱歉。

我还在 sql 标签下发布了这个问题,看看是否有人知道仅使用 sql 的方法。

更新:我之前通过输入最后一个开始和结束时间来让它工作,然后当我进入 2 个新时间时,我检查了新的开始时间 >= 前一个,新的结束时间 <=之前的结束时间,如果是,我会跳过插入。

但是我不得不对程序进行一些更改,我无法再获得以前的开始/结束时间,我现在的想法是,如果我可以选择表中的最后 2 次并将它们保存到 java 端的变量中并且然后做我之前做的同样的比较

4

3 回答 3

1

我认为问题出在您的设计上。如果您的文本文件依赖于您不应该按原样保存在数据库中的顺序。

我会将该信息存储在一条记录中。例如,数据库中不需要 VALUE_ENUM 和两条记录,您只需要一条具有以下字段 START_SCHEDULE_TIME 和 END_SCHEDULE_TIME 的记录。现在使用该设计,您可以像这样进行选择:

从 ARRAY_BAC_SCH_Schedule 中选择 count(*),其中 finalStart >= START_SCHEDULE_TIME 和 finalEnd <= END_SCHEDULE_TIME

如果选择返回 1 那么你只是跳过而不插入。

于 2011-09-19T17:58:09.833 回答
1

可以说问题区域的特征/识别为 2 个或更多连续开始时间吗?我怀疑是这样。

如果是这种情况,那么也许只需将您拥有的所有内容加载到表中,然后按时间顺序解析表。每次遇到 2 个连续的开始时间时,您都知道必须删除“this”开始/结束对。

当然,如果您连续遇到第三个开始时间,您知道您必须删除 2 个结束时间。

所以在伪代码中 - 数据集按 Dev_Id、schedule_time、value_enum desc 排序

int NestCount = 0;
int CurrDevId = 0;

for each record
{

   // Optional DevId Logic Starts Here
   if ThisRecord.DevId <> CurrDevId then
   {
      if NestCount <> 0
      {
         CurrDevId = 0;
         RollBack;
         Shriek("Cannot Proceed Because The Data Are Fubar");
      }
      else
      {
         CurrDevId = ThisRecord.DevId;
      }
   } // And Ends Here

   if 
   CurrDevId <> 0 && // Optional DevId Logic 
   IsAStartRecord() 
   {
      If NestCount > 0 
      {
        DeleteThisRecord();
      } 
      NestCount += 1;     
   }
   else // Is an end record
   {
      NestCount -= 1; 
      If NestCount > 0 
      {
        DeleteThisRecord();
      } 
   }
}

如果可以将其实现为存储过程,我可能会这样做。

这有帮助吗?

于 2011-09-20T09:50:49.247 回答
0

感谢您的帮助,但我最终只是在:时间上进行了字符串替换并将其转换为 a.然后将其转换为 adouble并将该时间保存到临时变量中,然后下次我有时间检查该系统时如果开始时间大于上次开始时间并且结束时间小于最后一次,那么如果它们介于两者之间,我可以避免添加,不是 100% 测试,但它适用于我尝试的第一个系统

于 2011-09-20T14:11:45.667 回答