那么,我实际上有4个字段:M1 D1 M2 D2
表示第1个月第1天,第2个月第2天
例子:
- 10,1,5,31 10月1日至5月31日(跨两年)
- 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解决问题。我只是希望有人能帮我理清逻辑。
非常感谢!
这是我想出的每天都有效的逻辑:
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
在一个变量中有一个月和一天,想要匹配这个记录。我认为最简单的逻辑是将这些值转换为可比较的"数字"。比如:
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)。