2016-09-23 62 views
0

我正在嘗試創建我的SQL語法,以便我們可以有多種輸入。我想出瞭如何做一個日期,它的工作。 我SYN是:如何在SQL多個值中聲明日期

DECLARE @MyDay AS VARCHAR(50); 
DECLARE @NextDay AS VARCHAR(50); 

SET @MyDay = '8/30/2016'; 
SET @NextDay = DATEADD(d, 1, @MyDay); 

不過,我堅持瞭如何做到這一點的多個日期。理想情況下,我希望將日期放在一定範圍內,並從中讀取記錄,即設置在10月1日和10日之間的範圍。

我使用SQL Server Management Studio 2008中

+1

有點不清楚。你在尋找一個(用戶驅動的)日期範圍還是多個範圍。另外爲什麼varchar和不約會? –

回答

0

如果你只是想16年8月30日和16年9月5日之間的一系列天,接下來的日子裏,你可以使用一個派生表的方法如下圖所示。

declare @n int; 
declare @StartDate datetime, @EndDate datetime; 

set @n = 5; 
set @StartDate = '20160830'; 
set @EndDate = dateadd(day, @n, @StartDate); 

select cast(dateadd(day, number, @StartDate) as date) as MyDate, 
cast(dateadd(day, number + 1, @StartDate) as date) as MyNextDate 
from 
    (select distinct number from master.dbo.spt_values 
    where name is null 
    ) n 
where dateadd(day, number, @StartDate) < @EndDate; 

或者,您可以使用臨時表,表變量來存儲您的日期或cte。

下面給出了一個遞歸cte實例。請注意,您將要設置MAXRECURSION選項,如果你有很長的日期範圍爲默認最大遞歸100

declare @n int; 
declare @StartDate datetime, @EndDate datetime; 

set @n = 5; 
set @StartDate = '20160830'; 
set @EndDate = dateadd(day, @n, @StartDate); 

;with DateSeq as 
(
select cast(@StartDate as date) as MyDate 
union all 
select dateadd(day , 1, MyDate) AS MyDate 
    from DateSeq where dateadd (day, 1, MyDate) < @EndDate 
) 
select MyDate, dateadd(day , 1, MyDate) AS NextDate 
from DateSeq; 

一個臨時表實現的例子如下。

declare @MyDateRange table(MyDate date); 

Insert into @MyDateRange values('8/30/2016') 
Insert into @MyDateRange values('9/1/2016') 
Insert into @MyDateRange values('9/2/2016') 
Insert into @MyDateRange values('9/3/2016') 
Insert into @MyDateRange values('9/4/2016') 

select MyDate, dateadd(day, 1, MyDate) as NextDate from @MyDateRange