首页 > 解决方案 > 如何提取范围内的日期?

问题描述

我有一个包含日期范围内数据的表(SQL Server 2017)。

+---------+----------+------------+---------------+-------------+
| good_id | store_id | promo_name | date_id_begin | date_id_end |
+---------+----------+------------+---------------+-------------+
| 1122    | 42       | promo_1    | 2020-02-01    | 2020-02-05  |
+---------+----------+------------+---------------+-------------+
| 2244    | 41       | promo_2    | 2020-03-01    | 2020-03-03  |
+---------+----------+------------+---------------+-------------+

我需要在此期间按天获取这些数据。

+---------+----------+------------+---------------+
| good_id | store_id | promo_name | date_id_begin |
+---------+----------+------------+---------------+
| 1122    | 42       | promo_1    | 2020-02-01    |
+---------+----------+------------+---------------+
| 1122    | 42       | promo_1    | 2020-02-02    |
+---------+----------+------------+---------------+
| 1122    | 42       | promo_1    | 2020-02-03    |
+---------+----------+------------+---------------+
| 1122    | 42       | promo_1    | 2020-02-04    |
+---------+----------+------------+---------------+
| 1122    | 42       | promo_1    | 2020-02-05    |
+---------+----------+------------+---------------+
| 2244    | 41       | promo_2    | 2020-03-01    |
+---------+----------+------------+---------------+
| 2244    | 41       | promo_2    | 2020-03-02    |
+---------+----------+------------+---------------+
| 2244    | 41       | promo_2    | 2020-03-03    |
+---------+----------+------------+---------------+

我可以从循环内的某个范围内提取日期,但如何选择其他信息(good_id、store_id、promo_name)?

标签: sqlsql-servertsqldaterecursive-query

解决方案


一种选择是递归查询:

with cte as (
    select good_id, store_id, promo_name, date_id_begin, date_id_end
    from mytable
    union all
    select good_id, store_id, promo_name, dateadd(day, 1, date_id_begin), date_id_end
    from cte 
    where date_id_begin < date_id_end
)
select good_id, store_id, promo_name, date_id_begin from cte

如果您有超过 100 天的范围,则需要option(max_recursion 0)在查询末尾添加。


推荐阅读