按日期范围选择数据并换行
Posted
技术标签:
【中文标题】按日期范围选择数据并换行【英文标题】:select data by date range with year wrapping 【发布时间】:2012-01-23 15:34:48 【问题描述】:我不知道这是否可能。我有一个 mysql 表,其中包含广告商的季节开始和结束日期。日期不会逐年变化,因此它们以 MM-DD 格式存储。
这些通常在一年内连续,即 3 月 1 日 (03-01) 到 10 月 1 日。 (10-01)。
但季节可能会在年底结束,例如 10 月 1 日。 (10-01) 至 3 月 1 日 (03-01)(即春夏不营业)
现在我需要选择用户输入的日期范围(例如 12 月 1 日到 12 月 12 日)在广告客户季节开始/结束日期内的条目(通过 php)。
如果赛季开始/结束在数学上是连续的(例如 03-01 - 10-01),这很容易,但是当它们可能连续或不连续时我该怎么做。
对不起,如果我没有解释清楚,但我的头快要爆炸了......
【问题讨论】:
有什么方法可以对应用程序/表进行小改动以便同时存储年份? 您的赛季开始/结束栏是哪些栏类型?如果它们是DATE
列,那么这个问题很容易解决,不是吗?如果它们不是 DATE
列,那么它们应该是。 :-)
【参考方案1】:
为该数据使用正确的列类型 (DATE),季节换行不再是问题。
要获取用户提供的日期范围适用的季节:
SELECT foo
FROM seasons_table
WHERE <user range low> >= season_range_low
AND <user range high> <= season_range_high
【讨论】:
【参考方案2】:怎么样:
SELECT *
FROM table
WHERE CASE
WHEN date_start > date_end THEN
$date_to_check >= date_start OR $date_to_check <= date_end
ELSE
$date_to_check >= date_start AND $date_to_check <= date_end
END;
【讨论】:
+1 这很好,没有日期化。 (请注意,如果$date_to_check IN (date_start, date_end)
不会返回任何行,但这不是 >= /
【参考方案3】:
您应该能够在 SQL 中使用 AND 语句来检查两种可能性:
SELECT * FROM table WHERE
season_start_date <= advertiser_start_date AND
season_end_date >= advertiser_end_date OR
无论什么季节结束日期都需要高于广告结束日期,即使是在新的一年。所以这应该可行,但我同意@SoboLAN,如果你只是将年份添加到日期字段中会更简单。
【讨论】:
以上是关于按日期范围选择数据并换行的主要内容,如果未能解决你的问题,请参考以下文章