[解決済み] 日付範囲の比較
2022-08-07 12:12:02
質問
MySQL で、日付範囲 (範囲開始と範囲終了) のリストがある場合。
10/06/1983 to 14/06/1983
15/07/1983 to 16/07/1983
18/07/1983 to 18/07/1983
また、別の日付範囲がすでにリスト内の任意の範囲を含んでいるかどうかをチェックしたいのですが、どのようにすればよいでしょうか?
例
06/06/1983 to 18/06/1983 = IN LIST
10/06/1983 to 11/06/1983 = IN LIST
14/07/1983 to 14/07/1983 = NOT IN LIST
どのように解決するのですか?
これは古典的な問題で、実は論理を逆にすれば簡単なんです。
例を挙げましょう。
ここにある1つの期間と、何らかの形で重なる他の期間のさまざまなバリエーションを載せておきます。
|-------------------| compare to this one
|---------| contained within
|----------| contained within, equal start
|-----------| contained within, equal end
|-------------------| contained within, equal start+end
|------------| not fully contained, overlaps start
|---------------| not fully contained, overlaps end
|-------------------------| overlaps start, bigger
|-----------------------| overlaps end, bigger
|------------------------------| overlaps entire period
逆に、重ならないものを全部貼らせてください。
|-------------------| compare to this one
|---| ends before
|---| starts after
ということで、単純に比較を減らすと
starts after end
ends before start
を実行すると、重なっていないものをすべて見つけ、次にマッチしていない期間をすべて見つけます。
最後のNOT IN LISTの例では、これらの2つのルールにマッチしていることがわかります。
次の期間が範囲内か範囲外かを決定する必要があります。
|-------------|
|-------| equal end with start of comparison period
|-----| equal start with end of comparison period
テーブルに range_end と range_start というカラムがある場合、一致するすべての行を取得するための簡単な SQL を以下に示します。
SELECT *
FROM periods
WHERE NOT (range_start > @check_period_end
OR range_end < @check_period_start)
このとき NOT が入っていることに注意してください。つの単純なルールは、すべての にマッチしない の行を見つけるので、単純なNOTはそれを逆にしてこう言います。 もしそれがマッチしない行の一つでないなら、マッチする行の一つでなければなりません。 .
ここで単純な反転の論理を適用してNOTを取り除くと、以下のようになります。
SELECT *
FROM periods
WHERE range_start <= @check_period_end
AND range_end >= @check_period_start
関連
-
[解決済み】JavaScriptで「無効な日付」のDateインスタンスを検出する
-
解決策:java.sql.SQLException: ユーザー ''@'localhost'' (パスワード: YES を使用) のアクセスが拒否されました。
-
[解決済み] JavaScriptの日付の書式設定方法
-
[解決済み] JavaScriptで現在の日付を取得するには?
-
[解決済み] MySQLでコマンドラインを使用してSQLファイルをインポートするにはどうすればよいですか?
-
[解決済み] ...値に挿入する ( SELECT ... FROM ... )
-
[解決済み] JavaScriptで日付の書式設定に関するドキュメントはどこにありますか?
-
[解決済み] JavaScriptでUnixのタイムスタンプを時刻に変換する
-
[解決済み] オブジェクトが日付であるかどうかを確認するには?
-
[解決済み] JavaScriptの日付をUTCに変換する方法を教えてください。
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
MySQL】1136 - 列数が1行目の値数と一致しない問題を解決
-
[解決済み] Oracle Trigger ORA-04098: トリガーが無効で、再バリデーションに失敗しました。
-
[解決済み] SQL Serverで実行中の合計を計算する
-
[解決済み] 指定されたスキーマにテーブルが存在するかどうかを確認する方法
-
[解決済み] 各GROUP BYグループの最初の行を選択しますか?
-
[解決済み] 2つの日付範囲が重なっているかどうかを判定する
-
[解決済み] ATTACHで開いたSQLiteデータベースファイルのテーブルを一覧表示するにはどうすればよいですか?
-
[解決済み] SQL Serverでシングルクォートをエスケープするにはどうすればよいですか?
-
[解決済み] SQL Server の CASE ステートメントで OR がサポートされていない。
-
[解決済み] フラットテーブルをツリーにパースする最も効率的/エレガントな方法は何ですか?