我正试图从新的学术季度开始算起。我正在跟踪学生何时报名,并想比较学期开始前的天数。该季度的第一天并不总是一样。我在中央数据库中有一个日期表,其中列出了每个日期,日期所在的季度以及第一天的标志。
因此,这是我要执行的操作的简化表。
+-----------+---------+----------------+---------------------+
| Date | Quarter | First Day Flag | Days before quarter |
+-----------+---------+----------------+---------------------+
| 1/1/2020 | Q1 | Y | 0 |
+-----------+---------+----------------+---------------------+
| 1/2/2020 | Q1 | N | -5 |
+-----------+---------+----------------+---------------------+
| 1/3/2020 | Q1 | N | -4 |
+-----------+---------+----------------+---------------------+
| 1/4/2020 | Q1 | N | -3 |
+-----------+---------+----------------+---------------------+
| 1/5/2020 | Q1 | N | -2 |
+-----------+---------+----------------+---------------------+
| 1/6/2020 | Q1 | N | -1 |
+-----------+---------+----------------+---------------------+
| 1/7/2020 | Q2 | Y | 0 |
+-----------+---------+----------------+---------------------+
| 1/8/2020 | Q2 | N | -5 |
+-----------+---------+----------------+---------------------+
| 1/9/2020 | Q2 | N | -4 |
+-----------+---------+----------------+---------------------+
| 1/10/2020 | Q2 | N | -3 |
+-----------+---------+----------------+---------------------+
| 1/11/2020 | Q2 | N | -2 |
+-----------+---------+----------------+---------------------+
| 1/12/2020 | Q2 | N | -1 |
+-----------+---------+----------------+---------------------+
| 1/13/2020 | Q3 | Y | 0 |
+-----------+---------+----------------+---------------------+
我需要代码来生成从该季度的第一天开始倒数的第四列。
尝试一下,
create table #temp(Dates Date,Quarters char(2)
,FirstDayFlag char(1), DaysBeforeQuarter int)
insert into #temp values
('1/1/2020','Q1','Y' ,null )
,('1/2/2020','Q1','N' ,null )
,('1/3/2020','Q1','N' ,null )
,('1/4/2020','Q1','N' ,null )
,('1/5/2020','Q1','N' ,null )
,('1/6/2020','Q1','N' ,null )
,('1/7/2020','Q2','Y' ,null )
,('1/8/2020','Q2','N' ,null )
,('1/9/2020','Q2','N' ,null )
,('1/10/2020','Q2','N',null )
,('1/11/2020','Q2','N',null )
,('1/12/2020','Q2','N',null )
,('1/13/2020','Q3','Y',null )
update T
set DaysBeforeQuarter=case when t.FirstDayFlag='Y'
then 0 else datediff(day,t1.dates,t.dates) end
from #temp t
cross apply(select top 1 dates
from #temp t1 where t1.FirstDayFlag='Y'
and t1.Dates>t.dates)t1
select * from #temp
drop table #temp
非常感谢您的帮助!您的建议为我提供了一个起点,让我可以开始工作!
这里是我的代码似乎有效。
SELECT
d.CalendarDate as [Date]
,d.AcademicYrQtrCode as [Quarter]
,d.BeginInd as [FirstDayIndicator]
,CASE WHEN d.BeginInd = 'Y' THEN 0 ELSE DATEDIFF (d, d2.CalendarDate, d.CalendarDate) END
FROM DateTable d
JOIN (SELECT * FROM DateTable d WHERE d.BeginInd = 'Y') d2
ON CONVERT (int, d.AcademicYrQtrCode) = CONVERT (int, d2.AcademicYrQtrCode) - 1