Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在SQL Server中创建视图,为每个日期创建多行,其中包含计算日期和标识符列_Sql_Sql Server_Database_Date_Sql View - Fatal编程技术网

在SQL Server中创建视图,为每个日期创建多行,其中包含计算日期和标识符列

在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

我需要创建一个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/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。这基本上回答了您提出的问题,只是使用了表值函数而不是视图。