在SQL Server中创建视图,为每个日期创建多行,其中包含计算日期和标识符列
我需要创建一个VIEW/Select语句,该语句将采用开始日期,并为每个日期创建3个不同的行。一行计算30天,从开始日期算起,再计算60天,再计算90天。此外,每一行都需要有一个标识符,说明日期是从开始日期算起的30天、60天还是90天。因此,假设开始日期为2020年1月9日。然后,视图将为每个开始日期返回以下内容:在SQL Server中创建视图,为每个日期创建多行,其中包含计算日期和标识符列,sql,sql-server,database,date,sql-view,Sql,Sql Server,Database,Date,Sql View,我需要创建一个VIEW/Select语句,该语句将采用开始日期,并为每个日期创建3个不同的行。一行计算30天,从开始日期算起,再计算60天,再计算90天。此外,每一行都需要有一个标识符,说明日期是从开始日期算起的30天、60天还是90天。因此,假设开始日期为2020年1月9日。然后,视图将为每个开始日期返回以下内容: Row Header : Start Date, AdditionalDate, AdditionalDays Row 1 : 01/01/2020, 02/01/202
Row Header : Start Date, AdditionalDate, AdditionalDays
Row 1 : 01/01/2020, 02/01/2020, 30
Row 2 : 01/02/2020, 03/01/2020, 60
Row 3 : 01/01/2020, 04/01/2020, 90
抱歉,忘了提一下,但开始日期是从表中选择的。如从约会中选择startDate
我正在使用Microsoft SQL Server和一个新的SQL用户。非常感谢您的帮助和建议
谢谢大家! 我不确定为什么您希望从视图中得到什么-视图不带参数 但是,下面是一个查询,它根据给定的日期参数在30、60和90天后生成三行:
declare @start_date date = '2020-01-01';
select
@start_date,
dateadd(day, additional_days, @start_date) additional_date,
additional_days
from (values (30), (60), (90)) x(additional_days)
我不确定你说的是30天还是一个月。如果你想要几个月,那么:
declare @start_date date = '2020-01-01';
select
@start_date,
dateadd(month, additional_months, @start_date) additional_date,
additional_months
from (values (1), (2), (3)) x(additional_months)
另一方面,如果从现有表开始,则这是交叉联接:
我不确定为什么您希望从视图中得到什么-视图不带参数 但是,下面是一个查询,它根据给定的日期参数在30、60和90天后生成三行:
declare @start_date date = '2020-01-01';
select
@start_date,
dateadd(day, additional_days, @start_date) additional_date,
additional_days
from (values (30), (60), (90)) x(additional_days)
我不确定你说的是30天还是一个月。如果你想要几个月,那么:
declare @start_date date = '2020-01-01';
select
@start_date,
dateadd(month, additional_months, @start_date) additional_date,
additional_months
from (values (1), (2), (3)) x(additional_months)
另一方面,如果从现有表开始,则这是交叉联接:
不能将视图用于此目的,但可以使用内联表值函数:
create function dates (
@date date,
@period int,
@num int
)
returns table
as return
with dates as (
select @date as start_date,
dateadd(day, @period, @date) as additional_date,
@period as additional_days, 1 as n
union all
select start_date,
dateadd(day, @period, additional_date),
additional_days + @period, n + 1
from dates
where n < @num
)
select start_date, additional_date, additional_days
from dates;
是一个dbfiddle。您不能为此目的使用视图,但可以使用内联表值函数:
create function dates (
@date date,
@period int,
@num int
)
returns table
as return
with dates as (
select @date as start_date,
dateadd(day, @period, @date) as additional_date,
@period as additional_days, 1 as n
union all
select start_date,
dateadd(day, @period, additional_date),
additional_days + @period, n + 1
from dates
where n < @num
)
select start_date, additional_date, additional_days
from dates;
是一个数据小提琴。您可以使用递归cte:
with cte as
( Select 1 as Header
,Start
,dateadd(day, 30, Start) as AdditionalDate
,30 as AdditionalDays
from Appointment
union all
select Header+1
,Start
,dateadd(day, 30, AdditionalDate)
,AdditionalDays + 30
from cte
where Header <= 2
)
Select * from cte
或添加月份而不是天数:
with cte as
( Select 1 as Header
,Start
,dateadd(month, 1, Start) as AdditionalDate
,datediff(day, Start, dateadd(month, 1, Start)) as AdditionalDays
from Appointment
union all
select Header+1
,Start
,dateadd(month, 1, AdditionalDate)
,datediff(day, Start, dateadd(month, 1, AdditionalDate))
from cte
where Header <= 2
)
Select * from cte
请参见您可以使用递归cte:
with cte as
( Select 1 as Header
,Start
,dateadd(day, 30, Start) as AdditionalDate
,30 as AdditionalDays
from Appointment
union all
select Header+1
,Start
,dateadd(day, 30, AdditionalDate)
,AdditionalDays + 30
from cte
where Header <= 2
)
Select * from cte
或添加月份而不是天数:
with cte as
( Select 1 as Header
,Start
,dateadd(month, 1, Start) as AdditionalDate
,datediff(day, Start, dateadd(month, 1, Start)) as AdditionalDays
from Appointment
union all
select Header+1
,Start
,dateadd(month, 1, AdditionalDate)
,datediff(day, Start, dateadd(month, 1, AdditionalDate))
from cte
where Header <= 2
)
Select * from cte
请参见视图不采用参数。你到底想做什么?@GMB-我将从现有表中获取开始日期值,就像从约会中选择开始日期一样。不需要任何参数。然后我想知道从这个开始日期算起的30天、60天和90天,在带有标识符的单独行中,这样我就知道它是30天、60天还是90天的计算。是的,select语句也可以。好的。我的答案的最后一部分应该满足您的要求。视图不接受参数。你到底想做什么?@GMB-我将从现有表中获取开始日期值,就像从约会中选择开始日期一样。不需要任何参数。然后我想知道从这个开始日期算起的30天、60天和90天,在带有标识符的单独行中,这样我就知道它是30天、60天还是90天的计算。是的,select语句也可以。好的。我的答案的最后一部分应该做你想做的。我将从数据库中的一个表中获取开始日期,然后计算。所以不需要参数。所以我想select语句就可以了。@sye。这基本上回答了您提出的问题,只是使用表值函数而不是视图。我将从数据库中的表中获取开始日期,然后计算。所以不需要参数。所以我想select语句就可以了。@sye。这基本上回答了您提出的问题,只是使用了表值函数而不是视图。