Sql 如何提取范围内的日期?
我有一个SQL Server 2017表,其中包含日期范围内的数据Sql 如何提取范围内的日期?,sql,sql-server,tsql,date,recursive-query,Sql,Sql Server,Tsql,Date,Recursive Query,我有一个SQL Server 2017表,其中包含日期范围内的数据 +---------+----------+------------+---------------+-------------+ | good_id | store_id | promo_name | date_id_begin | date_id_end | +---------+----------+------------+---------------+-------------+ | 1122 | 42
+---------+----------+------------+---------------+-------------+
| 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\u id、store\u id、promo\u name?一个选项是递归查询:
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天以上,则需要在查询结束时添加选项Max_recursion 0。如果没有日历或理货表,则可以使用临时理货表 范例 返回
good_id store_id promo_name Date
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 Date
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