1

タイトルの言い方がよくわからなかったので、申し訳ありません。いくつかの開始および停止スケジュール時刻をデータベースにロードしようとしていますが、同じシステムの開始時刻と停止時刻が重複することがあります。たとえば、ある時刻と5:30 to 12:30同じシステムの別の時刻が重複することがあります。8:30 to 10:30そのデータの挿入を避けたいと考えています。テーブルに。

私はjdbcとodbcブリッジを使用してJavaプログラムでこれをすべて実行しています。ユーザーがスケジュールの生成をクリックすると、テキストファイルからすべてのスケジュール情報が読み取られ、データベースに挿入されます。プログラムが既存の時間の間にある時間を読み取るとき、挿入をスキップしたいと思います。

私のアイデアは、テキストファイルから取得した終了時間をデータベース内の時間の最大値と比較する方法をいくつか検討する必要があり、その値よりも小さい場合はこの挿入をスキップしますが、最大値を関連付ける方法がわかりません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_ENUM0 であるすべての行は停止時刻です。この場合、他の開始時間と終了時間の間にある時間を削除しようとしています。この場合、行 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

問題のある領域は、2つ以上の連続した開始時間によって特徴付け/識別されていると言っても過言ではありませんか?そうだと思います。

その場合は、おそらく、持っているすべてのものをテーブルにロードしてから、テーブルを時間順に解析します。2つの連続する開始時間に遭遇するたびに、「この」開始/終了ペアを削除する必要があることがわかります。

もちろん、3番目の開始時刻が連続して発生した場合は、2つの終了時刻を削除する必要があることがわかります。

したがって、擬似コードで-データセットはDev_Id、schedule_time、value_enumdescで並べ替えられます

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 に答える
1

問題はあなたのデザインにあると思います。テキスト ファイルがその順序に依存している場合は、そのままデータベースに保存しないでください。

その情報を 1 つのレコードだけに保存​​します。たとえば、データベースに VALUE_ENUM と 2 つのレコードを含める代わりに、次のフィールド START_SCHEDULE_TIME と END_SCHEDULE_TIME を持つ 1 つのレコードが必要になります。そのデザインを使用すると、次のような選択を行うことができます。

ARRAY_BAC_SCH_Schedule から count(*) を選択します。ここで、finalStart >= START_SCHEDULE_TIME および finalEnd <= END_SCHEDULE_TIME です。

選択が1を返す場合は、スキップして挿入しません。

于 2011-09-19T17:58:09.833 に答える
0

助けてくれ:てありがとう..double開始時刻が前回の開始時刻よりも大きく、終了時刻が最後の開始時刻よりも小さかった場合、それらが間に入った場合、追加を避けることができました。100% テストされたわけではありませんが、最初に試したシステムでは機能しました。

于 2011-09-20T14:11:45.667 に答える