在SQL Server中创建视图以为每个日期创建多个行,并带有计算出的日期和标识符列

问题描述

我需要创建一个采用开始日期的VIEW / Select语句,并为每个日期创建3个不同的行。从开始日期开始,一行计算30天,另外计算60天,再计算90天。此外,每行还需要有一个标识符,该标识符说明日期是从开始日期算起的30天,60天还是90天。可以说开始日期是2020年9月1日。然后,视图将在每个开始日期返回该值:

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用户。非常感谢您的帮助和建议。

谢谢!

解决方法

我不确定为什么您希望从视图中获得什么-视图不带参数。

但是,这是一个查询,该查询根据给定的date参数在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,additional_months
from (values (1),(2),(3)) x(additional_months)

另一方面,如果您从现有表开始,则为cross join

select 
    t.*,x.additional_days,t.start_date) additional_date,x.additional_days
from mytable t
cross join (values (30),(90)) x(additional_days
,

您不能为此使用视图,但是可以使用内联表值函数:

create function dates (
    @date date,@period int,@num int
)
returns table 
as return 
        with dates as (
              select @date as start_date,@period,@date) as additional_date,@period as additional_days,1 as n
              union all
              select start_date,additional_date),additional_days + @period,n + 1
              from dates
              where n < @num
             )
        select start_date,additional_date,additional_days
        from dates;

Here是db 小提琴。

,

您可以使用递归cte:

if (etCardExpiry.getText().toString().isEmpty()) {
                etCardExpiry.setError("Expiry cannot be empty. Format: MM/YY");
                return;
            } else if (etCardExpiry.getText().toString().length() < 5) {
                etCardExpiry.setError("Please check Card expiry & try again");
                return;
            } else if (etCardExpiry.getText().toString().matches("(?:0[1-9]|1[0-2])/[0-9]{2}")) {
                etCardExpiry.setError("Please check Card expiry format & try again");
                return;
            } else {
                // Passed Card Expiry validation
            }

或者添加几个月而不是几天:

with cte as 
 ( Select 1 as Header,Start,30,Start) as AdditionalDate,30 as AdditionalDays 
   from Appointment
   union all
   select Header+1,AdditionalDate),AdditionalDays + 30
   from cte
   where Header <= 2
 )
Select * from cte

请参见fiddle

相关问答

错误1:Request method ‘DELETE‘ not supported 错误还原:...
错误1:启动docker镜像时报错:Error response from daemon:...
错误1:private field ‘xxx‘ is never assigned 按Alt...
报错如下,通过源不能下载,最后警告pip需升级版本 Requirem...