0

したがって、基本的に4つのフィールドがあります:M1 D1、M2 D2

それらは月1日1、月2日2を表します

例:

  • 10月1日から5月31日までの10、1、5、31(2つの異なる年にまたがる)
  • 6月1日から7月4日までの6、1、7、4
  • 7月5日から8月1日までの7、5、8、1
  • 8月2日〜9月30日8、2、9、30日

基本的に私には月と日があり、それらのレコードのどれがその間にあるかを知りたいです。言語固有のものは必要ありませんが、テーブルにそれらがあり、SQLの問題を解決しようとしています。誰かにロジックを手伝ってもらいたいのです。

本当にありがとう!

4

2 に答える 2

1

これが私が思いついたロジックで、毎日機能します。

WHERE (m BETWEEN m1 AND m2 AND d BETWEEN d1 AND d2)
OR (m BETWEEN m1 AND m2 AND ( (m = m1 AND d >= d1) OR (m = m2 AND d <= d2) OR (m > m1 AND m < m2) ))
OR (m1 > m2 AND ( m >= m1 OR m <= m2) AND d BETWEEN d1 AND d2)
OR (m1 > m2 AND ( m >= m1 OR m <= m2) AND ( (m = m1 AND d >= d1) OR (m = m2 AND d <= d2) OR (m > m1 OR m < m2) ))

また、元の例では実現されていない状況を含めるように例を更新しました。

  • 10,6から5,5
  • 5,6から7,4
  • 7,5から8,1
  • 8,2から10.5
于 2013-01-07T22:16:58.107 に答える
0

したがって、変数に月と日があり、レコードを照合する必要があります。最も簡単なロジックは、これらの値を比較可能な「数値」に変換することだと思います。何かのようなもの:

from t
where (month*100+day between m1*100+d1 and m2*100+d2 and m1*100+d1 <= m2*100+d2) or
      (month*100+day not between m2*100+d2+1 and m1*100+d1-1and m2*100+m2 < m1*100+d1)

「100」のルールは、最長の月(31)よりも大きく、最初のケースでは妥当に見えるもの(1001および531)を生成するというものです。

于 2013-01-07T19:41:16.537 に答える