2017-09-14 76 views
-2

I have my table valus like in image我想選擇在SQL

我想通過DaysCount列 迭代開始日期值,請別人幫我寫的SQL Server查詢,以便我可以執行要求的動態範圍內的所有日期。

在此先感謝。

+0

是提供足夠的信息。另外,你沒有提出具體的問題。 – JohnH

回答

0

您還沒有一個明確的答案提供了足夠的信息,但如果所有你想要做的是讓在日期列中的所有日期:

SELECT StartDates AS Dates 
FROM table_name 
+0

我想迭代startdate到DaysCount列值 – Nadeem

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 

- 編輯 - 我會強烈建議使用符合表像我張貼,因爲它是在這麼許多情況下非常有用。但有時候這是行不通的。沒問題。這是一種你可以內聯的方式。請注意,由於您似乎並不需要太多的數值,因此我在這裏也做了相當短的統計表。

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 
+0

我不想創建任何視圖或表 我需要它在飛行 – Nadeem

+0

偉大的答案肖恩,一如既往。 +1 – scsimon

+0

@NadeemZee你不必創建視圖。你可以使用CTE。 – scsimon

0

首先建立一個日期表,你可以加入,然後再加入到表的東西,如:

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

這裏是一個遞歸CTE的另一種方式,儘管肖恩·蘭格答案肯定是首選的方法。

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) 
+0

不工作的查詢來檢查這個 ( '20170623',1), ( '20170626',3), ( '20170807',1), ( '20170926',4) – Nadeem

+0

您的評論是沒有意義的,但我在我的答案中提供了一個可重複的示例鏈接。我看不出你在做什麼來造成問題。 http://rextester.com/IOZPTC82923 – scsimon

0

考慮到你是好與SQL遊標

---Creating records 
with cte as(Select Cast('01-01-2000' as Date) as startDate,1 as countD 
union all 
Select Cast('02-01-2000' as Date) as startDate,3 as countD 
union all 
Select Cast('10-01-2000' as Date) as startDate,1 as countD) 
Select * into #Temp from cte; 

--Creating temp table to hold results 
create table #Result(
startDate Date, 
) 

--Using cursor to insert records 
DECLARE @startDate Date, 
@count int; 


DECLARE db_cursor CURSOR FOR 
SELECT startDate , countD 
FROM #Temp 

OPEN db_cursor 
FETCH NEXT FROM db_cursor INTO @startDate , @count 

WHILE @@FETCH_STATUS = 0 
BEGIN 
    WHILE @count> 0 
     BEGIN 
     set @count = @count-1; 
     set @startDate = DATEADD(DAY, @count, cast (@startDate as date)); 
     INSERT INTO #Result 
     Select @startDate; 

     END 

    FETCH NEXT FROM db_cursor INTO @startDate , @count 
END 

CLOSE db_cursor 
DEALLOCATE db_cursor 

Select * from #Result