查询两个日期范围之间的订阅是否有效

时间:2013-06-03 19:45:57

标签: mysql date

我有一张存储季节性地址日期的表格:

addressStartDate,addressEndDate

我正在努力寻找5月份季节性地址历史悠久的人,但我不太清楚如何格式化它。我似乎无法概念化如何基于两个日期字段构建查询。 “活跃”部分是我遇到问题的部分。

在这种情况下,日期的年份都存储为1000,因为季节性地址切换每年都在同一时间发生。所以我正在寻找的是在DATE'1000-05-01'和DATE'1000-05-31'之间地址有效的人 - 我希望这足以描述我的问题

4 个答案:

答案 0 :(得分:1)

也许:

SELECT *
FROM mytable
WHERE addressStartDate <= ? AND addressEndDate <= ?

答案 1 :(得分:1)

你在寻找这样的东西:

SELECT addressStartDate, addressEndDate, otherfields
FROM yourTable
WHERE addressStartDate >= '1000-05-01'
   AND addressEndDate < '1000-06-01'

或者根据您的问题的解释,如果月份中只需要存在地址日期,可能是这样的:

SELECT addressStartDate, addressEndDate, otherfields
FROM yourTable
WHERE addressStartDate < '1000-06-01'
   AND addressEndDate >= '1000-05-01'

根据您存储数据的方式(有或没有时间),而不是使用BETWEEN,我更喜欢使用&gt; =和&lt;如所须。

答案 2 :(得分:1)

试试这个

SELECT *
FROM yourtable
WHERE addressStartDate >= '1000-05-01' 
AND addressEndDate <= '1000-05-30'

答案 3 :(得分:1)

如果你想在整个五月活跃,那么:

select *
from t
where t.StartDate <= date('1000-05-01') and t.StopDate >= date('1000-05-31')

如果你想在5月的任何日子活动:

select *
from t
where t.StartDate <= date('1000-05-31') and t.StopDate >= date('1000-05-01')

StopDate限制可能会被拒绝,具体取决于停止日期的日期是否被视为有效日期。

由于您的数据结构存在问题,因此您的数据是否在日历年之前也可能会变得复杂。 StartDate可能大于StopDate,这意味着一年换行。要处理年份包装,请尝试以下方法:

select *
from t
where (t.StartDate < t.StopDate and t.StartDate <= date('1000-05-01') and t.StopDate >= date('1000-05-31')) or
      (t.StartDate > t.StopDate and ( t.StartDate <= date('1000-05-01') or t.StopDate >= date('1000-05-31')))