按日期范围选择数据并换行

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,如果你只是将年份添加到日期字段中会更简单。

【讨论】:

以上是关于按日期范围选择数据并换行的主要内容,如果未能解决你的问题,请参考以下文章

SQL选择数据并按日期范围分组数据

按日期选择器范围排序表

选择日期范围,根据关闭条件计算范围内的多条记录,按班次分组

MySQL 中基于 MSSQL 语法按 YEAR 选择日期范围的等效语法是啥?

elementui日期选择能支持按旬选择吗?

Python追加写入文件并换行