我不太知道怎么写这个标题,对此我感到很抱歉。我试图将一些启动和停止调度时间加载到数据库中,但有时同一系统的启动和停止时间会重叠,例如一次可能是5:30 to 12:30,另一次可能是8:30 to 10:30,我希望避免将数据插入表中。
我使用jdbc和odbc桥在java程序中完成所有这些工作,当用户单击generate时,它从文本文件中读取所有调度信息,然后将其插入数据库。当程序读取已存在时间之间的时间时,我想跳过插入操作。
因此,我的想法必须是如何比较我从文本文件得到的结束时间与数据库中时间的最大值,如果它小于这个值,那么跳过这个插入,但是我不知道如何将最大值绑定到一个if语句中。另一个想法是,在im完成所有插入之后,只删除SCHEDULE_TIME大于SCHEDULE_TIME列中的min值和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行从开始到顶部替换为停止时间--所有VALUE_ENUM为1的行都是开始时间,VALUE_ENUM为0的所有行都是停止时间。我试图删除介于其他开始和停止时间之间的时间--在本例中,删除第3行和第4行。记住,这个表实际上从文本文件中创建了数百行,所以我不能仅仅手动删除它,最好能找到一种方法来避免插入它。
下面是我当前insert方法的一个副本,忽略我使用的所有额外列,它们与问题无关,它们只是使用,所以我为正确的系统添加和删除。
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次,并将它们保存到java端的一个变量中,然后进行与以前相同的比较。
发布于 2011-09-20 14:11:45
谢谢您的帮助,但我最后只是在:上做了一个字符串替换,并将其转换为一个.,然后将其转换为一个double,并将时间保存为一个临时变量。然后,下次我为该系统占用时间时,我检查了该系统的启动时间是否大于上一次开始时间,如果结束时间小于最后一次,那么如果它们介于两者之间,我可以避免添加,而不是100%测试,但它对我尝试的第一个系统有效。
发布于 2011-09-19 17:58:09
我认为问题在于你的设计。如果您的文本文件依赖于顺序,则不应该像在数据库中那样保存。
我只会把这些信息保存在一张唱片里。例如,与其在数据库中有VALUE_ENUM和两条记录,不如只需要一条包含以下字段START_SCHEDULE_TIME和END_SCHEDULE_TIME的记录。现在,使用该设计,您只需进行如下选择:
从ARRAY_BAC_SCH_Schedule中选择count(*),其中finalStart >= START_SCHEDULE_TIME和finalEnd <= END_SCHEDULE_TIME
如果select返回1,则跳过而不插入。
发布于 2011-09-20 09:50:49
公平地说,问题区域是由两个或更多连续的开始时间来确定的吗?我怀疑是的。
如果是这样的话,那么也许只需将所有的数据加载到表中,然后按时间顺序解析表。每次你遇到两个连续的开始时间,你知道你必须删除‘这个’开始/结束对。
当然,如果您在一排中遇到第三个开始时间,您知道您必须删除两个结束时间。
因此,在伪码中,数据集由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();
}
}
}如果有可能将其实现为存储过程,我可能会这样做。
这有用吗?
https://stackoverflow.com/questions/7474411
复制相似问题