使用jdbc-odbc删除具有冲突时间的行

时间:2011-09-19 16:46:31

标签: java sql insert jdbc-odbc

我不太确定怎么说这个标题对此很抱歉。我正在尝试将一些启动和停止计划时间加载到数据库中,但有时同一系统的启动和停止时间将重叠,例如一次可能是5:30 to 12:30,然后同一系统的另一次可能是{{ 1}}我想避免将这些数据插入表中。

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

我的想法必须要比较一些我从文本文件得到的结束时间与数据库中时间的MAX值的比较,如果它小于该值,则跳过此插入但我不知道如何绑定将MAX值转换为if语句。另一个想法是在完成所有插入后,只删除8:30 to 10:30大于SCHEDULE_TIME列中的最小值且SCHEDULE_TIME小于最大值的行。 SCHEDULE_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 为1的所有行都是开始时间,而VALUE_ENUM为0的所有行都是停止时间。我试图删除在其他开始和停止时间之间的时间,在这种情况下删除行3和4.请记住,这些表实际上从文本文件创建了数百行,所以我不能手动删除它,它将是最好的,如果我能找到一种方法来避免插入它。

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

VALUE_ENUM

我希望我解释得这个,对不起,如果问题不清楚的话。

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

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

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

3 个答案:

答案 0 :(得分:1)

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

我会将这些信息存储在一条记录中。例如,您不需要在数据库中使用VALUE_ENUM和两条记录,而只需要一条记录,其中包含以下字段:START_SCHEDULE_TIME和END_SCHEDULE_TIME。现在有了这个设计,你可以选择这样的选择:

  

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

如果select返回1,那么你只需跳过而不插入。

答案 1 :(得分: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();
      } 
   }
}

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

这有帮助吗?

答案 2 :(得分:0)

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