我想在sql中选择动态范围内的所有日期

时间:2017-09-14 19:27:33

标签: sql-server

I have my table valus like in image

我想通过DaysCount列迭代startdate值 请有人帮我写sql server查询,以便我可以执行要求。

提前致谢。

5 个答案:

答案 0 :(得分:1)

你的问题很缺乏清晰但我真的明白你想要的东西。实现这一目标的最佳方法是使用计数表。我在系统中保留了一个视图。

create View [dbo].[cteTally] as

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    E4(N) AS (SELECT 1 FROM E2 a, E2 b), --10E+4 or 10,000 rows max
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E4
    )
select N from cteTally

现在我们需要一个表来开始保存我们的数据。这是您将来发布的内容。然后我们可以简单地利用我们的计数表和瞧的力量,问题很简单。

declare @SomeTable table
(
    StartDate date
    , DaysCount int
)

insert @SomeTable
select '2017-06-23', 1 union all
select '2017-06-26', 3 union all
select '2017-08-07', 1

select MyDate = dateadd(day, t.N - 1, st.StartDate)
from @SomeTable st
join cteTally t on t.N <= st.DaysCount
order by st.StartDate
    , t.N

这将输出:

2017-06-23
2017-06-26
2017-06-27
2017-06-28
2017-08-07

- EDIT-- 我强烈建议使用像我发布的计数表,因为它在很多情况下非常有用。但有时这并不起作用。没问题。这是一种你可以内联的方式。请注意,由于您似乎不需要那么多的值,因此我在这里的计数表也相当短了。

WITH
    E1(N) AS (select 1 from (values (1),(1),(1),(1),(1),(1),(1),(1),(1),(1))dt(n)),
    E2(N) AS (SELECT 1 FROM E1 a, E1 b), --10E+2 or 100 rows
    cteTally(N) AS 
    (
        SELECT  ROW_NUMBER() OVER (ORDER BY (SELECT NULL)) FROM E2
    )

select MyDate = dateadd(day, t.N - 1, st.StartDate)
from @SomeTable st
join cteTally t on t.N <= st.DaysCount
order by st.StartDate
    , t.N

答案 1 :(得分:1)

这是递归cte的另一种方式,尽管Sean Lange的答案绝对是首选方法。

<强> HERE IS A DEMO

declare @table table (StartDate date, DaysCount int)
insert into @table
values
('20170623',1),
('20170626',3),
('20170807',1)


declare @max date = (select max(StartDate) from @table)

;with cte as(
    select min(StartDate) as StartDate
    from @table
    union all
    select dateadd(day,1,StartDate)
    from cte
    where StartDate <  @max
)


select 
    c.StartDate
from 
cte c 
inner join
@table t on 
    c.StartDate < dateadd(day,t.DaysCount,t.StartDate)
    and c.StartDate >= t.StartDate
option (maxrecursion 0)

答案 2 :(得分:0)

您尚未提供足够的信息以确定答案,但如果您想要做的只是在日期列中获取所有日期:

SELECT StartDates AS Dates
FROM table_name

答案 3 :(得分:0)

首先创建一个可以加入的日期表,然后使用以下内容加入表:

[Date] BETWEEN [StartDate] AND DATEADD(day, [DaysCount], [StartDate])

答案 4 :(得分:0)

考虑到你在sql

中使用游标很好
AlgoList = types.Select(t => Activator.CreateInstance(t)).ToList();