繁体   English   中英

是否有一种灵活的方法来指定日期范围?

[英]Is there a flexible way to specify ranges of dates?

我正在使用 MySQL。

我有一些这样开始的查询:

WITH dates (start_date, end_date) AS (
  SELECT '2020-11-01', '2020-11-02'
    UNION ALL SELECT '2020-11-02', '2020-11-03',
    UNION ALL SELECT '2020-11-03', '2020-11-04')
SELECT dates.start_date, dates.end_date, id, COUNT(*)
 FROM dates 
   INNER JOIN ...

我有时还需要运行相同的查询,但每个日期范围是一周(周一到周日)或日历月。 而且,这些有时有100个以上,除了占用很多行,需要很长时间编写之外,还很容易出现错别字。

有没有更优雅和灵活的方式来实现这一点? 理想情况下,我希望能够仅指定总体开始日期、总体结束日期和期间(每天、每周、每月、每年等)

您可以使用递归 CTE:

with recursive dates as (
      select date('2020-11-01') as start_date, date('2020-11-02') as end_date
      union all
      select start_date + interval 1 day, end_date + interval 1 day
      from dates
      where start_date < '2020-12-01'
     )
select *
from dates;

是一个 db<>fiddle。 当然,几个月后逻辑会有所不同。

  1. 创建一些date_ranges表,其中存储:系列标识符、范围号、范围边界。
  2. 每次需要此表中尚不存在的系列时,将所需系列插入其中。
  3. 将此表用作查询中的源表(如果需要,可能带有缩小范围的附加条件)。
  4. 删除以后永远不会使用的系列。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM