1

私は少し奇妙な論理の問題を抱えており、頭を包み込むことができないようです(おそらくそれをあまりにも長い間研究したためです)。

私が働いている場所には、使用している機器のステータスを追跡するために使用する必要のある非常に古いソフトウェアがあります。このソフトウェアは、これらのステータスを操作してダウンタイムの適切な分析を試みるための機能をほとんど提供していません。私はAccessでデータベースアプリケーションに取り組んでおり(これが私に利用できる唯一のツールであるため)、古いシステムからより簡単に操作できる形式にステータスデータをインポートします。

古いプログラムからステータスデータを吐き出す方法はかなり簡単です。

EQUIPNAME STATUS STARTDATETIME ENDDATETIME

そのテキストを読んで、Accessのテーブルに挿入するのは簡単です。私が抱えている問題は、ある機器がさまざまな日付範囲でさまざまなステータスで何時間費やしたかを見つけようとすることから来ています。

開始/終了の日付/時刻は任意の長さにすることができます。どの行に日付が含まれているかを見つけるのは困難です。私はSQLでBETWEENステートメントを使用して、ほとんどの場合うまく機能するステートメントを見つけようとしています。

SELECT * FROM Statuses WHERE 
    (StartDateTime BETWEEN [StartDT] AND [EndDT]) 
OR 
    (EndDateTime BETWEEN [StartDT] AND [EndDT])

本当の問題は、StartDateTimeがStartDTの前であり、EndDateTimeがEndDTの後である場合です(つまり、私が探している範囲全体がこのステータスの開始日/終了日の内側にあります)。それは単にそれを見つけられません、それは理にかなっています。

私はこれに対するエレガントな解決策を思い付くことができないようです。指定された日付範囲に含まれる、または含まれるステータスを含むすべての行を選択できる必要があります。私は通常、このような単純な問題のためにここに来ることはありませんが、私の脳とグーグルフーは私を失敗させています。

サンプルデータの少し:

EQUIP STATUS STARTDATETIME    ENDDATETIME
A123  OPER   01/30/2013 21:30 12/31/1999 00:00
A123  DFM    01/26/2013 10:42 01/30/2013 21:29
A123  OPER   01/01/2013 00:00 01/26/2013 10:41
B123  OPER   01/01/2013 00:00 12/31/1999 00:00
C123  DFU    01/29/2013 12:31 12/31/1999 00:00
C123  OPER   01/01/2013 00:00 01/29/2013 12:30
4

2 に答える 2

2

あらゆる種類の予約の共謀は、次の場合に発生します。

RequestStartDate <= EndDate 
and 
RequestEndDate >= StartDate 

上記もオーバーラップを返します。したがって、今日と明日をクエリし、範囲が年の初めから年の終わりまで始まる場合、クエリは範囲に含まれます。

例えば:

 Select * from tblEQUIP 
 where 
   #01/31/2013# <= ENDDATETIME
   and
   #02/01/2013# >= StartDateTime

その時点で、各レコードを「処理」できます。次のようなものを使用する必要があります。

Do while RecordDate.eof = false

   For datePtr = RequestStartDateTime to RequestendDateTime
      If datePtr >= RecordData!StartDateTime and DatePtr <= RecordData!EndDateTime then
         DaysTotal = DaysTotal  + 1
      End if
   Next DatePtr
   recordData.Movenext
loop

上記はエアコードですが、最初に重複するレコードを取得するために必要な基本的な処理ループを示し、次に、指定された日付範囲に該当する日付範囲内の各レコードの日/時間を合計する処理ループを示しています。

于 2013-01-31T17:09:25.573 に答える
0

面白い質問!今は詳しく説明する時間があまりないので申し訳ありませんが、そのためのPartition関数を調べるか、日付を列見出しとしてクロス集計クエリを実行することをお勧めします。msofficeサイトここで詳細をご覧ください。

于 2013-01-31T16:20:01.457 に答える