如何在 SQL 多个值中声明日期
How to declare dates in SQL multiple value
我正在尝试创建我的 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 月 5 日之间设置范围。
我正在使用 SQL Server Management Studio 2008
如果您只想要 2016 年 8 月 30 日和 2016 年 9 月 5 日之间的一系列日期和接下来的几天,您可以使用如下派生 table 方法。
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;
或者,您可以使用临时 table、table 变量来存储您的日期,或者也可以使用 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;
临时table实现示例如下。
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
我正在尝试创建我的 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 月 5 日之间设置范围。
我正在使用 SQL Server Management Studio 2008
如果您只想要 2016 年 8 月 30 日和 2016 年 9 月 5 日之间的一系列日期和接下来的几天,您可以使用如下派生 table 方法。
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;
或者,您可以使用临时 table、table 变量来存储您的日期,或者也可以使用 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;
临时table实现示例如下。
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