Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 使用jdbc odbc删除时间冲突的行_Java_Sql_Insert_Jdbc Odbc - Fatal编程技术网

Java 使用jdbc odbc删除时间冲突的行

Java 使用jdbc odbc删除时间冲突的行,java,sql,insert,jdbc-odbc,Java,Sql,Insert,Jdbc Odbc,我不太清楚这个标题该怎么说,对此我很抱歉。我试图将一些启动和停止计划时间加载到数据库中,但有时同一系统的启动和停止时间会重叠,例如一个时间可能是5:30到12:30,然后同一系统的另一个时间可能是8:30到10:30,我希望避免将该数据插入表中 我在java程序中使用jdbc和odbc桥来完成这一切,当用户单击generate schedules时,它从文本文件中读取所有日程信息,然后将其插入数据库。当程序读取已经存在的时间之间的时间时,我想跳过插入 因此,我的想法是如何将从文本文件中获得的结束

我不太清楚这个标题该怎么说,对此我很抱歉。我试图将一些启动和停止计划时间加载到数据库中,但有时同一系统的启动和停止时间会重叠,例如一个时间可能是
5:30到12:30
,然后同一系统的另一个时间可能是
8:30到10:30
,我希望避免将该数据插入表中

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

因此,我的想法是如何将从文本文件中获得的结束时间与数据库中时间的最大值进行比较,如果小于该值,则跳过此插入,但我不知道如何将最大值绑定到if语句中。另一个想法是,在im完成所有插入后,只需删除
SCHEDULE\u TIME
大于
SCHEDULE\u TIME
列中最小值且
SCHEDULE\u TIME
小于
SCHEDULE\u 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\u ENUM
为1的所有行都是开始时间,
VALUE\u 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();
}
private void Insert()引发SQLException
{
stmt=conn.createStatement();
字符串sqlStm=“更新数组\u BAC\u SCH\u计划集计划\u时间={t'+finalEnd+”}其中计划\u时间>={t'+finalStart+“}和”+

“时间表时间我认为问题出在你的设计上。如果你的文本文件是按顺序保存的,你就不应该按原样保存在数据库中

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

从数组中选择计数(*),其中finalStart>=
开始时间和结束时间可以公平地说,问题区域由两个或更多连续的开始时间来表征/识别吗?我怀疑是这样

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

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

因此,在伪代码中,数据集按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();
      } 
   }
}
int NestCount=0;
int CurrDevId=0;
每项记录
{
//可选的DevId逻辑从这里开始
如果ThisRecord.DevId CurrDevId,则
{
如果嵌套计数为0
{
CurrDevId=0;
回降;
尖叫(“无法继续,因为数据为Fubar”);
}
其他的
{
CurrDevId=ThisRecord.DevId;
}
}//到此为止
如果
CurrDevId 0&&//可选的设备逻辑
IsAStartRecord()
{
如果NestCount>0
{
删除此记录();
} 
NestCount+=1;
}
else//是结束记录
{
NestCount-=1;
如果NestCount>0
{
删除此记录();
} 
}
}
如果可以将其作为存储过程实现,我可能会这样做


这有帮助吗?

谢谢你的帮助,但我最终只是在
上做了一个字符串替换,并将其转换为
,然后将其转换为
双精度
,并将该时间保存到一个临时变量中,然后在下次我有时间使用该系统时,我会检查开始时间是否大于上次的时间艺术时间,如果结束时间小于最后一个时间,那么如果它们介于两者之间,我可以避免添加,不是100%测试,但它对我尝试的第一个系统有效

您如何知道确定要使用的范围?例如,9:30到15:30(第1行,第2行)。但它可能是9:30到13:30(第1行,第4行)?@AlfredoO是的,它可能是
9:30到13:30
,但是它不会
insert
插入
12:30到13:30
,因为我函数中的
更新将成功,所以
更新成功
将等于1,所以如果
语句中有
insert
,希望回答您的问题是的,就像在我的文本文件中,我可以有
9:30到11:30
,然后
10:30到15:30
我的程序会插入
9:30
11:30
,然后在我的更新中,它会看到
10:30
落在最后一个停止时间之前,并且
15:30
fal在它之后,我更新
11:30
使其等于
15:30
,而文本文件中的下一行可能是
12:30到13:30
,这不符合我的更新要求,因此失败,这允许它进入插入文本文件。文本文件按开始时间排序,因此其进程按开始时间排序我很感激,但我对数据库的设计没有任何控制权。我也意识到我不能只删除其中>=min的计划时间