如何解决在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
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。