私は少し奇妙な論理の問題を抱えており、頭を包み込むことができないようです(おそらくそれをあまりにも長い間研究したためです)。
私が働いている場所には、使用している機器のステータスを追跡するために使用する必要のある非常に古いソフトウェアがあります。このソフトウェアは、これらのステータスを操作してダウンタイムの適切な分析を試みるための機能をほとんど提供していません。私は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